Notes:
- bulk & respired 14C used for contraints
- three time points for bulk 14C (2001, 2009, 2019)
- two time points for respired CO2 (2001, 2019)
- steady-state C stocks (mean of 2001, 2009 stock data) used to determine inputs
This script requires the following input: obs.bulk.14c, obs.resp.14c, obs.Cstock
Workflow
- Fit models by eye for initial parameter estimates
- Run modfit using bulk and respired 14C time series data
- Run bayesian parameter optimization
- Reject models w/ stocks outside ±2SE of measured values
- Adjust inputs w/ modeled stocks and reject models w/ unrealistic inputs
- If inputs are not realistic [how to come up with realistic ranges?], may have to implement some constraints on parameter optimization, e.g. if (In > max | In < min) { error } else { fit pars}. Could calculate rejection rate associated with this process…
- Compare models using AIC; other metrics? E.g. collinearity of parameters, ssr, bias, etc.
- Get ages and transit times from “best fit” models, e.g. lowest AIC value
- Compare distribution of ages/transit times with age distribution from density fractionation, thermal fractionation
- Compare ages, transit times, to mineral characteristics (PCM, minC proportion, etc.)
- Assess model structure/complexity [objective metrics here?]
Questions
- How to set acceptable ranges for inputs?
- How to deal with lag times? Would be nice to avoid fitting a lag parameter. Options: could set lag by depth, but likely the optimal lag value will vary by site.
Should copy relevant code for preparing obs.bulk.14c, obs.resp.14c
load pre-built bulk, respired 14C objs
SOC stocks
load min data
Error in names(test)[1, 3:9] : incorrect number of dimensions
Load initial parameter lists (1p, 2pp, 2ps, 3pp, 3ps)
modFit parameter optimization
Currently 3-pool lagged model fits are commented out. Fitting 6 parameters seems beyond the scope of the dataset. When the lag is not fit the modFit optimization performs better. Perhas could use the lags fit with the 2-pool model optimization for the 3-pool systems?
pool 3 < 0
pool 3 < 0
pool 3 < 0
pool 3 < 0
pool 3 < 0
pool 3 < 0
pool 3 < 0
pool 3 < 0
pool 3 < 0
pool 3 < 0
NaNs producedCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singularCannot estimate covariance; system is singular
modFit timeseries
modFit SSR
modFit AIC
Lagged 2-pool models have higher AIC values than the non-lagged models for all sites except for the deeper layers at the GRrf sites (for which the models fit poorly anyway).
When comparing lagged 1-pool models to the 2-pool models without a lag, the 2-pool models perform better at the soil surface, but the 1-pool models perform slightly better at the deepest depth. Performance for the 10-20 cm layer is mixed. In general, the 1-pool models perform better than 2-pool models for the warm climate sites, while the 2-pool models perform better at the cold climate sites. For the cool climate sites, the 2-pool models perform better for andesitic parent materials; however, basaltic and granitic soils follow the overall depth trends: with better performance of the 2-pool models at the soil surface, and better performance of the 1-pool models at the deepest depth.




modFit par sens
Sensitivity of parameter kslow is 0!
modFit identifiability
Parameter combination of length > 2 are rarely identifiable
Ages & transit times
Fits for the 2pp and 2ps models were similar across the 0-10 cm depth layer. The only noticable exceptions were for the GRwf and GRrf sites. For the GRrf site, the fit for the 2pp model was essentially a one pool model, with nearly identical tau values of 1/170 for the fast and slow pools. In contrast, tau for the fast pool in the 2ps model fit at the GRrf site was 1, while the slow pool tau was 1/170. For the GRwf site, the 2pp fit had tau values of 21 and 152 for fast and slow pools, respectively, while the 2ps taus were smaller (longer turnover time): 57 and 1075 respectively.
In general, due to the similarities in the fits and the differences in model structure, the ages and transit times were substantially longer for the series models than for the parallel models. However, mean ages and transit times for both the 2pp and 2ps fits appeared to be excessively long at several of the sites. This problem was especially apparent for the 10-20 cm and 20-30 cm depth layers, although we also observed ages for the ANpp site in the 0-10 cm depth layer that exceeded those of the other sites by an order of magnitude (ca. 1500 vs. 150). For the 10-20 cm layer, the cold climate granite site had the oldest mean ages: 1750 and 2500 for the 2pp and 2ps models respectively, with the mean age of the remaining sites = 350 yrs. The most striking outlier for age was the 20-30 cm layer at the BSwf site, for which both the 2pp and 2ps models had mean ages ≥ 95,000, exceeding the mean ages of the other sites by 1 to 2 orders of magnitude.
Bayesian fits
MCMC chains for most of the parameters, across all of the model structures, fail to converge after 1000 iterations. Should try 5000 itr for a subset, evaluate improvement, and consider optimal number of iterations.
Can also consider using smaller updatecov value (currently set equal to the number of iterations) during the burnin period to harness the power of the adaptive Metropolis method. Delayed rejection algorithm is probably not necessary given the generally high level of accepted runs (most >90%).
MCMC AIC
Comparison of AIC values between modFit parameter sets and MCMC sets indicate a clear performance increase for the MCMC parameters. However, when comparing relative AIC values among the MCMC parameter sets fit for parallel and series model structures, and the structures with or without lags are essentially indistinguishable. The difference in AIC values, i.e. \(\Delta\)AIC, is within 2 for all of the sites, indicating a high level of support for either model structure and either parameter set. Input calculations are also similar across model structures, although more of the two pool series model fits yield unrealistically high (or low) inputs.
[1] 0.5945797






















































[[1]]
[[2]]
[[3]]
[[4]]
[[5]]
[[6]]
[[7]]
[[8]]
[[9]]
[[10]]
[[11]]
[[12]]
[[13]]
[[14]]
[[15]]
[[16]]
[[17]]
[[18]]
[[19]]
[[20]]
[[21]]
[[22]]
[[23]]
[[24]]
[[25]]
[[26]]
[[27]]



























MCMC SOC stocks

MCMC SA & TT
Ages
System ages for the series model fits tend to be older than the parallel fits. Additionally, some of the ages are unrealistically old: ANpp 0-10 (32744). Ages for both the parallel and series fits are extraordinarily old for the BSwf_20-30 site, although the series model age is an order of magnitude greater than the parallel model: series = 921536 y, parallel = 94760 y. The age for the ANpp_0-10 site is also too old for parallel model: 1032 y (although still an order of magnitude younger than the series model age for the same site and depth).
Transit times
Transit times for the parallel models seem mostly reasonable. The cool climate basalt soils from the two deepest layers are an exception in that they are nearly 0, indicating a failure on the part of the model or poor data. Specifically, the reason that BSwf_20-30 is the worst fitting site for both model structures is likely related to a failure to resample the same site, due to logging in 2019 and possibly a failure to locate the correct site in 2009.
In contrast, the two deepest GRrf sites have overly long transit times for both model structures, likely a function of the anomolously old respired 14C signal at this site for these depths. The trend is also potentially apparent in the surface soil, where the transit time is nearly 150 years for the parallel model, compared to 75 years for the andesitic and basaltic soils. However, this is not visible in the series model for this site and depth.
Overall, the transit times for the series models do not seem realistic. Perhaps this is reflected in the estimates for inputs as well? Would be interesting to see if the lagged models perform better.
SA & TT for lagged models
The lagged models show similar trends to the models without lags, with more sites returning both ages and transit times that are unrealistically old for the series model structure than the parallel structure.
Oddly I don’t observe large differences in either age or transit time between the lagged and unlagged model fits. The exceptions are the sites where the model appears to have found local minima, and the age/transit time statistic is unreasonably high (or low) for either the lagged or unlagged fit.
LS0tCnRpdGxlOiBDb21wYXJpc29uIHNjcmlwdCBmb3IgU29pbFIgbW9kZWwgc3RydWN0dXJlcwphdXRob3I6Ci0gYWRkcmVzczogSGFucy1Lbm9lbGwtU3RyLiAxMCwgMDc3NDUgSmVuYSwgR2VybWFueQogIGFmZmlsaWF0aW9uOiAnMScKICBjb3JyZXNwb25kaW5nOiB5ZXMKICBlbWFpbDogamJlZW1AYmdjLWplbmEubXBnLmRlCiAgbmFtZTogSmVmZnJleSBCZWVtLU1pbGxlcgphZmZpbGlhdGlvbjoKLSBpZDogJzEnCiAgaW5zdGl0dXRpb246IERlcGFydG1lbnQgb2YgQmlvZ2VvY2hlbWljYWwgUHJvY2Vzc2VzLCBNYXggUGxhbmNrIEluc3RpdHV0ZSBmb3IgQmlvZ2VvY2hlbWlzdHJ5LAogICAgSmVuYSwgR2VybWFueQpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiBwYXBhamE6OmFwYTZfcGRmCiAgaHRtbF9ub3RlYm9vazoKICAgIGNzczogY3VzdG9tLmNzcwogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMicKICB3b3JkOiBwYXBhamE6OmFwYTZfZG9jeAogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICcyJwpkb2N1bWVudGNsYXNzOiBhcGE2CmRyYWZ0OiBubwpmaWdzaW50ZXh0OiB5ZXMKZmlndXJlbGlzdDogeWVzCmZsb2F0c2ludGV4dDogeWVzCmZvb3Rub3RlbGlzdDogbm8KYWx3YXlzX2FsbG93X2h0bWw6IHRydWUKbGluZW51bWJlcnM6IHllcwptYXNrOiBubwpjbGFzc29wdGlvbjogbWFuCnNob3J0dGl0bGU6IFNvaWxSIG1vZGVsIHN0cnVjdHVyZXMKdGFibGVsaXN0OiBubwpoZWFkZXJfaW5jbHVkZXM6Ci0gXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9Ci0gXHVzZXBhY2thZ2V7ZmxvYXR9Ci0gXHVzZXBhY2thZ2V7bG9uZ3RhYmxlfQotIFxzZXRsZW5ndGh7XGhlYWRoZWlnaHR9ezI4cHR9Ci0tLQpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICdjZW50ZXInLCBkZXYgPSBjKCdjYWlyb19wZGYnLCAncG5nJyksCiAgICAgICAgICAgICAgICAgICAgICBjcm9wID0gTlVMTCkKb3B0aW9ucyhzY2lwZW4gPSA1KQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShTb2lsUikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoSVNSYUQpCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShndCkKbGlicmFyeShHU0lGKQpsaWJyYXJ5KGFxcCkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KHBhcGFqYSkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KEZNRSkKbGlicmFyeShmb3JlY2FzdCkKYGBgCgpgYGB7ciBjb2wtcGFsc30KIyBjb2xvciBwYWxldHRlcyBmb3IgRUNPICYgUE0Kd2FybSA8LSAiI0JGODEyRCIKY29vbCA8LSAiIzgwQ0RDMSIKY29sZCA8LSAiIzAxNjY1RSIKZ3Jhbml0ZSA8LSAiIzlkYWJhOSIKYW5kZXNpdGUgPC0gIiMzODJkYmYiCmJhc2FsdCA8LSAiI2JmMzgyZCIKYGBgCgpgYGB7ciBsb2FkIHJhdy1kYXRhLWluZ2VzdCBmeH0Kc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2Ftc19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9lbG1faW5nZXN0LlIiKQpgYGAKCmBgYHtyIGF0bS0xNGN9CiMgdXNlIEh1YTIwMjEgKFNvaWxSIHBhY2thZ2UpCk5IWm9uZTIgPC0gcmVhZF9leGNlbCgKICAiLi4vZGF0YS9leHRlcm5hbC9IdWFfMjAyMS9TMDAzMzgyMjIyMTAwMDk1M3N1cDAwMi54bHMiLCBzaGVldCA9IDIsIHNraXAgPSA1LAogIGNvbF9uYW1lcyA9IGMoIlllYXIuQUQiLCAibWVhbi5EZWx0YTE0QyIsICJzZC5EZWx0YTE0QyIsICJtZWFuLkYxNEMiLCAic2QuRjE0QyIpKSAlPiUKICBkYXRhLmZyYW1lCgojIGZvcmNhc3QgZGF0YSB0aHJvdWdoIDIwMjEgKDIgYWRkaXRpb25hbCB5ZWFycykKeXJzIDwtIHNlcSgyMDAwLCAyMDE5LjI1LCBieSA9IDEvNCkgIyBBIHNlcmllcyBvZiB5ZWFycyBieSBxdWFydGVycwpuejIgPC0gc3BsaW5lKE5IWm9uZTJbICwgYygxLCA0KV0sIHhvdXQgPSB5cnMpICMgcXVhcnRlcmx5IHNwbGluZSBpbnRlcnBvbGF0aW9uIG9mIGZtIGRhdGEKbmh6MiA8LSB0cyhuejIkeSwgc3RhcnQgPSAyMDAwLCBmcmVxID0gNCkgIyBUcmFuc2Zvcm1hdGlvbiBpbnRvIGEgdGltZS1zZXJpZXMgb2JqZWN0Cm0gPC0gZXRzKG5oejIpICMgRml0cyBhbiBleHBvbmVudGlhbCBzbW9vdGhpbmcgc3RhdGUgc3BhY2UgbW9kZWwgdG8gdGhlIHRpbWUgc2VyaWVzCmYyIDwtIGZvcmVjYXN0KG0sIGggPSAyLjc1ICogNCkgIyBVc2VzIHRoZSBmaXR0ZWQgbW9kZWwgdG8gZm9yZWNhc3QgMiB5ZWFycyBpbnRvIHRoZSBmdXR1cmUKCiMgYmluZCBwcmUgYW5kIHBvc3QtYm9tYiBjdXJ2ZXM7IGFkZCBmb3JlY2FzdGVkIGRhdGEKYXRtMTRjIDwtIHJiaW5kKAogIGJpbmQuQzE0Y3VydmVzKEludENhbDIwLCBOSFpvbmUyLCAiQUQiKSwKICBkYXRhLmZyYW1lKFllYXIuQUQgPSBzZXEodHNwKGYyJG1lYW4pWzFdLHRzcChmMiRtZWFuKVsyXSwgYnk9MS90c3AoZjIkbWVhbilbM10pLAogICAgICAgICAgICAgRGVsdGExNEMgPSBzdXBwcmVzc1dhcm5pbmdzKAogICAgICAgICAgICAgICBjb252ZXJ0X2ZtX2QxNGMoCiAgICAgICAgICAgICAgICAgZm0gPSBhcy5udW1lcmljKGYyJG1lYW4pLCBvYnNfZGF0ZV95ID0gc2VxKDIwMTkuNzUsIDIwMjIsIGJ5ID0gLjI1KSwgdmVyYm9zZSA9IEZBTFNFKSksCiAgICAgICAgICAgICBTaWdtYSA9IE5BKQopCgojIGZpbHRlciB0byAxOTAwLTIwMjIgYW5kIGNhbGMgYW5udWFsIGF2ZXJhZ2VzCkRhdG0gPC0gZGF0YS5mcmFtZShEYXRlID0gc2VxKDE5MDAuNSwgMjAyMS41KSwgZDE0YyA9IE5BKQpmb3IgKGkgaW4gc2VxX2Fsb25nKERhdG0kRGF0ZSkpIHsKICBpeCA8LSB3aGljaChhdG0xNGMkWWVhci5BRCA+PSBEYXRtW2ksICJEYXRlIl0gJiBhdG0xNGMkWWVhci5BRCA8IERhdG1baSwgIkRhdGUiXSArIDEpCiAgRGF0bVtpLCAiZDE0YyJdIDwtIG1lYW4oYXRtMTRjW2l4LCAiRGVsdGExNEMiXSwgbmEucm0gPSBUUlVFKQp9CgojIHJtIG9ianMKcm0oTkhab25lMiwgbnoyLCBuaHoyLCBtLCBmMiwgaSwgaXgpCmBgYAoKIyBOb3RlczoKMS4gYnVsayAmIHJlc3BpcmVkIDE0QyB1c2VkIGZvciBjb250cmFpbnRzCiAgKiB0aHJlZSB0aW1lIHBvaW50cyBmb3IgYnVsayAxNEMgKDIwMDEsIDIwMDksIDIwMTkpCiAgKiB0d28gdGltZSBwb2ludHMgZm9yIHJlc3BpcmVkIENPMiAoMjAwMSwgMjAxOSkKMi4gc3RlYWR5LXN0YXRlIEMgc3RvY2tzIChtZWFuIG9mIDIwMDEsIDIwMDkgc3RvY2sgZGF0YSkgdXNlZCB0byBkZXRlcm1pbmUgaW5wdXRzCgoqVGhpcyBzY3JpcHQgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBpbnB1dDogb2JzLmJ1bGsuMTRjLCBvYnMucmVzcC4xNGMsIG9icy5Dc3RvY2sqCgojIFdvcmtmbG93CjEuIEZpdCBtb2RlbHMgYnkgZXllIGZvciBpbml0aWFsIHBhcmFtZXRlciBlc3RpbWF0ZXMKMi4gUnVuIG1vZGZpdCB1c2luZyBidWxrIGFuZCByZXNwaXJlZCAxNEMgdGltZSBzZXJpZXMgZGF0YQozLiBSdW4gYmF5ZXNpYW4gcGFyYW1ldGVyIG9wdGltaXphdGlvbgo0LiBSZWplY3QgbW9kZWxzIHcvIHN0b2NrcyBvdXRzaWRlIMKxMlNFIG9mIG1lYXN1cmVkIHZhbHVlcwogIC0gVGhlbiB3aGF0Pwo1LiBBZGp1c3QgaW5wdXRzIHcvIG1vZGVsZWQgc3RvY2tzIGFuZCByZWplY3QgbW9kZWxzIHcvIHVucmVhbGlzdGljIGlucHV0cwogICAgKiBJZiBpbnB1dHMgYXJlIG5vdCByZWFsaXN0aWMgW2hvdyB0byBjb21lIHVwIHdpdGggcmVhbGlzdGljIHJhbmdlcz9dLCBtYXkgaGF2ZSB0byBpbXBsZW1lbnQgc29tZSBjb25zdHJhaW50cyBvbiBwYXJhbWV0ZXIgb3B0aW1pemF0aW9uLCBlLmcuIGlmIChJbiA+IG1heCB8IEluIDwgbWluKSB7IGVycm9yIH0gZWxzZSB7IGZpdCBwYXJzfS4gQ291bGQgY2FsY3VsYXRlIHJlamVjdGlvbiByYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2Nlc3MuLi4KNi4gQ29tcGFyZSBtb2RlbHMgdXNpbmcgQUlDOyBvdGhlciBtZXRyaWNzPyBFLmcuIGNvbGxpbmVhcml0eSBvZiBwYXJhbWV0ZXJzLCBzc3IsIGJpYXMsIGV0Yy4KNy4gR2V0IGFnZXMgYW5kIHRyYW5zaXQgdGltZXMgZnJvbSAiYmVzdCBmaXQiIG1vZGVscywgZS5nLiBsb3dlc3QgQUlDIHZhbHVlCjguIENvbXBhcmUgZGlzdHJpYnV0aW9uIG9mIGFnZXMvdHJhbnNpdCB0aW1lcyB3aXRoIGFnZSBkaXN0cmlidXRpb24gZnJvbSBkZW5zaXR5IGZyYWN0aW9uYXRpb24sIHRoZXJtYWwgZnJhY3Rpb25hdGlvbgo5LiBDb21wYXJlIGFnZXMsIHRyYW5zaXQgdGltZXMsIHRvIG1pbmVyYWwgY2hhcmFjdGVyaXN0aWNzIChQQ00sIG1pbkMgcHJvcG9ydGlvbiwgZXRjLikKMTAuIEFzc2VzcyBtb2RlbCBzdHJ1Y3R1cmUvY29tcGxleGl0eSBbb2JqZWN0aXZlIG1ldHJpY3MgaGVyZT9dCgojIFF1ZXN0aW9ucwoxLiBIb3cgdG8gc2V0IGFjY2VwdGFibGUgcmFuZ2VzIGZvciBpbnB1dHM/CjIuIEhvdyB0byBkZWFsIHdpdGggbGFnIHRpbWVzPyBXb3VsZCBiZSBuaWNlIHRvIGF2b2lkIGZpdHRpbmcgYSBsYWcgcGFyYW1ldGVyLiBPcHRpb25zOiBjb3VsZCBzZXQgbGFnIGJ5IGRlcHRoLCBidXQgbGlrZWx5IHRoZSBvcHRpbWFsIGxhZyB2YWx1ZSB3aWxsIHZhcnkgYnkgc2l0ZS4KCioqU2hvdWxkIGNvcHkgcmVsZXZhbnQgY29kZSBmb3IgcHJlcGFyaW5nIG9icy5idWxrLjE0Yywgb2JzLnJlc3AuMTRjKioKCmBgYHtyIHJlYWQtMTRjLWRhdGEsIGluY2x1ZGUgPSBGQUxTRX0KIyAyMDAxLCAyMDE5CmFtc19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiYW1zX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQphbXNfcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGFtc19qZW5hX3Jlc3VsdHNfZGlycyksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfYW1zX3Jlc3VsdHMoYW1zX2plbmFfcmVzdWx0c19kaXJzW2ldKQp9KQpuYW1lcyhhbXNfcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiKQoKIyAyMDA5CnNyYS4wOS5hbGwgPC0gcmVhZF9leGNlbCgKICAiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsIAogIHNoZWV0ID0gIkRhdGFfU3VtbWFyeV8yMDE4X3BhcGVyIikgJT4lIAogIHR5cGUuY29udmVydCguLCBhcy5pcyA9IFRSVUUpICU+JSAKICBtdXRhdGUobWFzc19rZ20yID0gU29pbF9maW5lZnJhY3Rpb24gKiBUaGlja25lc3NfY20gKiBCRF9nX2NtXzMgKiAxMCkgJT4lCiAgZGF0YS5mcmFtZQpwcm9fbm1zIDwtIHN1YnN0cih1bmlxdWUoc3JhLjA5LmFsbCRwcm9fbmFtZSksIDEsIDQpCnNyYS4yMDA5LmxzIDwtIHNwbGl0KHNyYS4wOS5hbGwsIHNyYS4wOS5hbGwkcHJvX25hbWUpCm5hbWVzKHNyYS4yMDA5LmxzKSA8LSBwcm9fbm1zCgojIHJtIG9ianMKcm0oYW1zX2plbmFfcmVzdWx0c19kaXJzLCBwcm9fbm1zLCBzcmEuMDkuYWxsKQpgYGAKCiMgbG9hZCBwcmUtYnVpbHQgYnVsaywgcmVzcGlyZWQgMTRDIG9ianMKYGBge3Igb2JzLWJsay1yc3AtZnBtfQpsb2FkKCIvVXNlcnMvamVmZi9zcmEtdHMvc291cmNlL29icy5yZXNwLjE0Yy5SRGF0YSIpCmxvYWQoIi9Vc2Vycy9qZWZmL3NyYS10cy9zb3VyY2Uvb2JzLmJ1bGsuMTRjLlJEYXRhIikKbG9hZCgiZGVucy4wMS4wOS4xOS5zcC5kZi5SRGF0YSIpCgojIHB1bGwgb3V0IDIwMDkgb2JzZXJ2YXRpb25zIG9mIGJ1bGsgMTRDIGZvciBCU3dmXzEwLTIwLCBCU3dmXzIwLTMwIChtdWNoIGhpZ2hlciB0aGFuIGVpdGhlciAyMDAxIG9yIDIwMTkpCm9icy5idWxrLjE0Y1sxNzoxOF0gPC0gbGFwcGx5KG9icy5idWxrLjE0Y1sxNzoxOF0sIGZ1bmN0aW9uKHgpIHhbLXdoaWNoKHgkdGltZSA9PSAyMDA5LjUpLCBdKQoKIyBjcmVhdGUgZnBvbSBsaXN0IGZvciBhZGRpdGlvbmFsL3JlcGxhY2VtZW50IGNvbnN0cmFpbnRzCm9icy5mcG9tLjE0YyA8LSBsYXBwbHkoc3BsaXQoZGVucy4wMS4wOS4xOS5zcC5kZiwgZGVucy4wMS4wOS4xOS5zcC5kZiRQTWVjb19kZXB0aCksIGZ1bmN0aW9uKGRmKSB7CiAgZGYgJT4lCiAgICBmaWx0ZXIoZnJjID09ICJmUE9NIikgJT4lCiAgICBtdXRhdGUodGltZSA9IHllYXIgKyAuNSwKICAgICAgICAgICByZXNwID0gZnJjXzE0YykgJT4lCiAgICBzZWxlY3QodGltZSwgcmVzcCkgJT4lCiAgICBkYXRhLmZyYW1lCn0pIAoKIyBzY3JlZW4gb3V0IHJlc3AgMTRDIHZhbHVlcyA8IDJ4IFNFIG9mIGJ1bGsgMTRDCmJhZC5yZXNwIDwtIGxhcHBseShzZXFfYWxvbmcob2JzLnJlc3AuMTRjKSwgZnVuY3Rpb24oaSkgewogIHJlc3AgPC0gdGFwcGx5KG9icy5yZXNwLjE0Y1tbaV1dJHJlc3AsIG9icy5yZXNwLjE0Y1tbaV1dJHRpbWUsIG1lYW4pCiAgYnVsayA8LSB0YXBwbHkob2JzLmJ1bGsuMTRjW1tpXV0kYnVsa0MsIG9icy5idWxrLjE0Y1tbaV1dJHRpbWUsIG1lYW4pW2MoMSwgMyldCiAgaXggPC0gd2hpY2gocmVzcCAtIGJ1bGsgPCAwKQogIGlmIChsZW5ndGgoaXgpICE9IDApIHsKICAgIGJ1bGsuaXggPC0gb2JzLmJ1bGsuMTRjW1tpXV1bb2JzLmJ1bGsuMTRjW1tpXV0kdGltZSAlaW4lIG5hbWVzKGJ1bGspW2l4XSwgXQogICAgbiA8LSB0YXBwbHkoYnVsay5peCRidWxrQywgYnVsay5peCR0aW1lLCBsZW5ndGgpCiAgICBidWxrLjJ4LnNlIDwtIDIgKiAodGFwcGx5KGJ1bGsuaXgkYnVsa0MsIGJ1bGsuaXgkdGltZSwgc2QpIC8gc3FydChuKSkKICAgIGlpeCA8LSB3aGljaChyZXNwW2l4XSAtIGJ1bGtbaXhdIDwgYnVsay4yeC5zZSAqIC0xKQogICAgaWYgKGxlbmd0aChpaXgpID4gMCkgewogICAgICBuYW1lcyhyZXNwKVtpaXhdCiAgICB9CiAgfQp9KQpuYW1lcyhiYWQucmVzcCkgPC0gbmFtZXMob2JzLnJlc3AuMTRjKQpiYWQucmVzcCA8LSBGaWx0ZXIobGVuZ3RoLCBiYWQucmVzcCkKCiMgcmVtb3ZlIHJlc3AgZGF0YSA8IDJ4IFNFIG9mIGJ1bGsgMTRDIGZvciBHUnBwXzIwLTMwLCBHUnJmXzEwLTIwLCBHUnJmXzIwLTMwCm9icy5yZXNwLjE0YyRgR1JwcF8yMC0zMGAgPC0gb2JzLnJlc3AuMTRjJGBHUnBwXzIwLTMwYFsyOjQsIF0gIyByZW1vdmUgMjAwMSByZXAgMQpvYnMucmVzcC4xNGMkYEdScmZfMTAtMjBgIDwtIG9icy5yZXNwLjE0YyRgR1JyZl8xMC0yMGBbNCwgXSAjIGxlYXZlIDIwMTkgcmVwIDIKb2JzLnJlc3AuMTRjJGBHUnJmXzIwLTMwYCA8LSBvYnMucmVzcC4xNGMkYEdScmZfMjAtMzBgWzM6NCwgXSAjIGxlYXZlIDIwMTkKYGBgCgojIFNPQyBzdG9ja3MKYGBge3Igb2JzLWJsay1jLWRhdH0KIyAyMDE5CmVsbV9yZXN1bHRzX2RpciA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiZWxtX2plbmFfcmVzdWx0cy1zb2lsIiwgZnVsbC5uYW1lcyA9IFRSVUUpCmVsbV9yZXN1bHRzX2xzIDwtIHN1cHByZXNzTWVzc2FnZXMobGFwcGx5KHNlcV9hbG9uZyhlbG1fcmVzdWx0c19kaXIpLCBmdW5jdGlvbihpKSB7CiAgdGVtcGxhdGVfZmlsZSA8LSAiLi4vZGF0YS9yYXcvZWxtX2plbmFfdGVtcGxhdGUvZWxtX2plbmFfdGVtcGxhdGUyLnhscyIKICByZWFkX2plbmFfZWxtX3Jlc3VsdHMoZWxtX3Jlc3VsdHNfZGlyW2ldLCB0ZW1wbGF0ZV9maWxlKQp9KSkKbmFtZXMoZWxtX3Jlc3VsdHNfbHMpIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJlbG1famVuYV9yZXN1bHRzLXNvaWwiKQoKIyBleHRyYWN0IHRvIGRmCnNyYS4xOS5ibGtDLmFsbCA8LSBiaW5kX3Jvd3ModW5saXN0KGVsbV9yZXN1bHRzX2xzLCByZWN1cnNpdmUgPSBGQUxTRSkpICU+JQogIG11dGF0ZShQTWVjbyA9IHNhcHBseShzdHJzcGxpdChJRCwgIl8iKSwgIlsiLCAyKSwKICAgICAgICAgcHJvX3JlcCA9IHNhcHBseShzdHJzcGxpdChJRCwgIl8iKSwgIlsiLCAzKSwKICAgICAgICAgZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoSUQsICJfIiksICJbIiwgNCksCiAgICAgICAgIHllYXIgPSAyMDE5KQoKIyAwLTMwIGNtIG9ubHkKc3JhLjE5LmJsa0MgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcGxpdChzcmEuMTkuYmxrQy5hbGwsIHNyYS4xOS5ibGtDLmFsbCRQTWVjbyksIGZ1bmN0aW9uKGRmKSB7CiAgICBkZiRseXJfYm90IDwtIGFzLm51bWVyaWModW5saXN0KGxhcHBseShzdHJzcGxpdChkZiRkZXB0aCwgIi0iKSwgIltbIiwgMikpKQogICAgZGYgPC0gZGZbZGYkbHlyX2JvdCA8IDMxLCBdCiAgICBkZiRwcm9fbmFtZSA8LSBwYXN0ZShkZiRQTWVjbywgZGYkcHJvX3JlcCwgc2VwID0gIl8iKQogICAgcmV0dXJuKGRmWyAsIGMoInllYXIiLCAiUE1lY28iLCAicHJvX3JlcCIsICJkZXB0aCIsICJseXJfYm90IiwgIkMiLCAiTiIpXSkKICB9KSkKc2F2ZShzcmEuMTkuYmxrQywgZmlsZSA9ICJzcmEuMTkuYmxrQy5SRGF0YSIpCgojIGMtc3BsaW5lIGZ4CnNwLmZ4IDwtIGZ1bmN0aW9uKGRmLCBzcF92YXJfaW4sIHNwX3Zhcl9vdXQsIGQgPSB0KGMoMCwgMTAsIDIwLCAzMCkpLCB5ZWFyKSB7CiAgb3V0IDwtIGJpbmRfcm93cygKICAgIGxhcHBseShzcGxpdChkZiwgZGYkUE1lY28pLCBmdW5jdGlvbih4KSB7CiAgICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICAgIHNwIDwtIHN1cHByZXNzTWVzc2FnZXMoCiAgICAgICAgbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSBzcF92YXJfaW4sIGQgPSBkLCBzaG93LnByb2dyZXNzID0gRkFMU0UpKSR2YXIuc3RkCiAgICAgIHNwJHJlcCA8LSBzZXEoMSwgbnJvdyhzcCkpCiAgICAgIHNwICU+JQogICAgICAgIHBpdm90X2xvbmdlcihjb2xzID0gMTozLCBuYW1lc190byA9ICJkZXB0aCIsIHZhbHVlc190byA9IHNwX3Zhcl9vdXQpCiAgICB9KSwgLmlkID0gIlBNZWNvIikgJT4lCiAgICBtdXRhdGUobHlyX2JvdCA9IGFzLm51bWVyaWMoc3Vic3RyKHNhcHBseShzdHJzcGxpdChkZXB0aCwgIi0iKSwgIlsiLCAyKSwgMSwgMikpLAogICAgICAgICAgIHllYXIgPSB5ZWFyKSAlPiUgZGF0YS5mcmFtZQogIG91dFsgLCBjKCJQTWVjbyIsICJyZXAiLCAieWVhciIsICJseXJfYm90Iiwgc3BfdmFyX291dCldCn0KCiMjIDIwMDEKc3JhLjAxLmJsa0MgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsIHNoZWV0ID0gIjIwMDFfYnVsa19kYXRhIikgJT4lIHR5cGUuY29udmVydCguLCBhcy5pcyA9IFRSVUUpICU+JSBtdXRhdGUocHJvX25hbWUgPSBwYXN0ZShQTWVjbywgcHJvX3JlcCwgc2VwID0gIl8iKSkgJT4lIGRhdGEuZnJhbWUgCnNyYS4wMS5ibGtDIDwtIHNyYS4wMS5ibGtDW2Mod2hpY2goZ3JlcGwoIkFOIiwgc3JhLjAxLmJsa0MkSUQpKSwgd2hpY2goZ3JlcGwoIkJTIiwgc3JhLjAxLmJsa0MkSUQpKSwgd2hpY2goZ3JlcGwoIkdSIiwgc3JhLjAxLmJsa0MkSUQpKSksIF0Kc3JhLjAxLmJsa0MgPC0gc3JhLjAxLmJsa0Nbd2hpY2goIWlzLm5hKHNyYS4wMS5ibGtDJEMuKSksIF0KIyBjb252ZXJ0IGx5cl90b3AgdG8gbnVtZXJpYyBhbmQgYWRkIHByb19uYW1lIGNvbApzcmEuMDEuYmxrQyRseXJfdG9wIDwtIGFzLm51bWVyaWMoc3JhLjAxLmJsa0MkbHlyX3RvcCkKc3JhLjAxLmJsa0MkcHJvX25hbWUgPC0gcGFzdGUwKHNyYS4wMS5ibGtDJFBNZWNvLCBzcmEuMDEuYmxrQyRwcm9fcmVwKQpzcmEuMDEuYmxrQyRseXJfc29jIDwtIHNyYS4wMS5ibGtDJGJkLmcuY20zICogc3JhLjAxLmJsa0MkZmluZS5lYXJ0aC4gKiBzcmEuMDEuYmxrQyRDLiAqIChzcmEuMDEuYmxrQyRseXJfYm90IC0gc3JhLjAxLmJsa0MkbHlyX3RvcCkgKiAxMF4tMwpibGtDLnJlcC5zb2Muc3AuMDEuZGYgPC0gc3AuZngoc3JhLjAxLmJsa0MsICJseXJfc29jIiwgImx5cl9zb2MiLCB5ZWFyID0gMjAwMSkKCiMjIDIwMDkKc3JhLjA5LmJsa0MgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsIHNoZWV0ID0gIjIwMDlfYnVsa19kYXRhIikgJT4lIHR5cGUuY29udmVydCguLCBhcy5pcyA9IFRSVUUpICU+JSBkYXRhLmZyYW1lCnNyYS4wOS5ibGtDJFBNZWNvIDwtIHBhc3RlMCh0b3VwcGVyKHN1YnN0cihzcmEuMDkuYmxrQyRQYXJlbnRfTWF0ZXJpYWwsIDEsIDIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvbG93ZXIoc3JhLjA5LmJsa0MkQmlvbWUpKQpzcmEuMDkuYmxrQyRQTWVjbyA8LSBpZmVsc2UoCiAgc3Vic3RyKHNyYS4wOS5ibGtDJFBNZWNvLCAxLCAyKSA9PSAiQkEiLCAKICBwYXN0ZTAoIkJTIiwgc3Vic3RyKHNyYS4wOS5ibGtDJFBNZWNvLCAzLCA0KSksIAogIHNyYS4wOS5ibGtDJFBNZWNvKQpuYW1lcyhzcmEuMDkuYmxrQylbd2hpY2gobmFtZXMoc3JhLjA5LmJsa0MpID09ICJ0b3AubWluZXJhbCIpXSA8LSAibHlyX3RvcCIKbmFtZXMoc3JhLjA5LmJsa0MpW3doaWNoKG5hbWVzKHNyYS4wOS5ibGtDKSA9PSAiYm90dG9tLm1pbmVyYWwiKV0gPC0gImx5cl9ib3QiCnNyYS4wOS5ibGtDJGx5cl9zb2MgPC0gc3JhLjA5LmJsa0MkVGhpY2tuZXNzX2NtICogc3JhLjA5LmJsa0MkQkRfZ19jbV8zICogc3JhLjA5LmJsa0MkU29pbF9maW5lZnJhY3Rpb24gKiBzcmEuMDkuYmxrQyRDX3BjdCAqIDEwXi0xCiMgZml0IHNwbGluZSB0byBDIGRhdGEgKDAtMTAsIDEwLTIwLCAyMC0zMCBjbSBvdXRwdXQpCmJsa0MucmVwLnNvYy5zcC4wOS5kZiA8LSBzcC5meChzcmEuMDkuYmxrQywgImx5cl9zb2MiLCAibHlyX3NvYyIsIHllYXIgPSAyMDA5KQoKIyMgU09DIHN0b2NrcwojIHVzZSBtZWFuIG9mIDIwMDEgYW5kIDIwMDkgU09DIHN0b2NrcyBmb3Igc3RlYWR5LXN0YXRlIGVzdGltYXRlCmNzb2MuMTkuMF8zMC5kZiA8LSByYmluZChibGtDLnJlcC5zb2Muc3AuMDkuZGYsIGJsa0MucmVwLnNvYy5zcC4wMS5kZikgJT4lCiAgbXV0YXRlKGx5cl90b3AgPSBseXJfYm90IC0gMTAsCiAgICAgICAgIGx5cl9uYW1lID0gcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCkpCmNzb2MuMTkuMF8zMC5zdW0uZGYgPC0gY3NvYy4xOS4wXzMwLmRmICU+JQogIGdyb3VwX2J5KFBNZWNvLCBseXJfdG9wLCBseXJfYm90KSAlPiUKICBzdW1tYXJpemUoYWNyb3NzKGx5cl9zb2MsIC5mbnMgPSBsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSksCiAgICAgICAgICAgIG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIG11dGF0ZShseXJfbmFtZSA9IHBhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QpLAogICAgICAgICBseXJfc29jX2x3ciA9IGx5cl9zb2NfbWVhbiAtIGx5cl9zb2Nfc2QgLyBzcXJ0KG4pICogMiwKICAgICAgICAgbHlyX3NvY191cHIgPSBseXJfc29jX21lYW4gKyBseXJfc29jX3NkIC8gc3FydChuKSAqIDIpCmNzb2MuMTkuMF8zMC5zdW0ubHMgPC0gc3BsaXQoY3NvYy4xOS4wXzMwLnN1bS5kZiwgY3NvYy4xOS4wXzMwLnN1bS5kZiRseXJfbmFtZSkKY3NvYy4xOS4wXzMwIDwtIGxhcHBseShjc29jLjE5LjBfMzAuc3VtLmxzLCBmdW5jdGlvbihkZikgCiAgZGF0YS5mcmFtZShseXJfc29jID0gZGYkbHlyX3NvY19tZWFuLCBseXJfc29jX2x3ciA9IGRmJGx5cl9zb2NfbHdyLCBseXJfc29jX3VwciA9IGRmJGx5cl9zb2NfdXByKSkKb2JzLmNTdG9jayA8LSBsYXBwbHkoc3BsaXQoY3NvYy4xOS4wXzMwLmRmLCBjc29jLjE5LjBfMzAuZGYkbHlyX25hbWUpLCBmdW5jdGlvbih4KQogICAgICB4ICU+JSByZW5hbWUodGltZSA9IHllYXIsIGNTdG9jayA9IGx5cl9zb2MpICU+JSBzZWxlY3QodGltZSwgY1N0b2NrKSAlPiUgZGF0YS5mcmFtZSkKCiMgcm0gb2JqcwpybShlbG1fcmVzdWx0c19kaXIsIGVsbV9yZXN1bHRzX2xzLCBzcmEuMTkuYmxrQy5hbGwsIHNyYS4wMS5ibGtDLCAKICAgYmxrQy5yZXAuc29jLnNwLjAxLmRmLCBibGtDLnJlcC5zb2Muc3AuMDkuZGYsIAogICBjc29jLjE5LjBfMzAuZGYsIGNzb2MuMTkuMF8zMC5zdW0uZGYsIGNzb2MuMTkuMF8zMC5zdW0ubHMpCmBgYAoKIyBsb2FkIG1pbiBkYXRhCmBgYHtyIHJhczE4LXN1bW1hcnl9CnNyYS4wOS5hbGwgPC0gcmVhZF9leGNlbCgKICAiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsIAogIHNoZWV0ID0gIkRhdGFfU3VtbWFyeV8yMDE4X3BhcGVyIikgJT4lIAogIHR5cGUuY29udmVydCguLCBhcy5pcyA9IFRSVUUpICU+JSAKICBtdXRhdGUobWFzc19rZ20yID0gU29pbF9maW5lZnJhY3Rpb24gKiBUaGlja25lc3NfY20gKiBCRF9nX2NtXzMgKiAxMCkgJT4lCiAgZGF0YS5mcmFtZQpwcm9fbm1zIDwtIHN1YnN0cih1bmlxdWUoc3JhLjA5LmFsbCRwcm9fbmFtZSksIDEsIDQpCnNyYS4yMDA5LmxzIDwtIHNwbGl0KHNyYS4wOS5hbGwsIHNyYS4wOS5hbGwkcHJvX25hbWUpCm5hbWVzKHNyYS4yMDA5LmxzKSA8LSBwcm9fbm1zCgp0ZXN0IDwtIGxhcHBseShzcmEuMjAwOS5scywgZnVuY3Rpb24oeCkgewogIHgkUE1lY28gPC0gc3Vic3RyKHgkcHJvX25hbWUsIDEsIDQpCiAgeCRseXJfYm90IDwtIHgkYm90dG9tLm1pbmVyYWwKICB4JGx5cl90b3AgPC0geCR0b3AubWluZXJhbCAgCiAgCiAgIyBkZWZpbmUgY29sdW1ucyB0byBpdGVyYXRlIG92ZXIgYW5kIGNyZWF0ZSBlbXB0eSBsaXN0CiAgY29scyA8LSAyOTo4MAogIHNwLmxzIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoY29scykpCiAgCiAgIyBydW4gc3AgaW4gbG9vcAogIGZvciAoaSBpbiBzZXFfYWxvbmcoY29scykpIHsKICAgIGl4IDwtIGNvbHNbaV0KICAgIGlmIChhbnkoaXMubmEoeFsgLCBpeF0pKSkgewogICAgICBzcC5sc1tbaV1dIDwtIE5VTEwKICAgIH0gZWxzZSB7CiAgICAgIHNwLmxzW1tpXV0gPC0gc3AuZngoeCwgc3BfdmFyX2luID0gbmFtZXMoeClbaXhdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBzcF92YXJfb3V0ID0gbmFtZXMoeClbaXhdLCB5ZWFyID0gMjAwOSkgCiAgICB9CiAgfQogIAogICMgcmVtb3ZlIE5VTEwgZWxlbWVudHMKICB4LmNsZWFuIDwtIEZpbHRlcihsZW5ndGgsIHNwLmxzKQogIAogICMgUmVkdWNlIHRvIHNpbmdsZSBkYXRhIGZyYW1lCiAgUmVkdWNlKG1lcmdlLCB4LmNsZWFuKQp9KQoKIyBjb21iaW5lIGFsbCAxNEMgZGF0YSB3LyByYXMgZGF0YQppZiAoIWV4aXN0cygic3JhLjAxLjA5LjE5LmQuMTBkZiIpKSB7CiAgbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuMDEuMDkuMTkuZC4xMGRmIikKfQppZiAoIWV4aXN0cygic3JhLjAxLjA5LjE5LmQuMjBkZiIpKSB7CiAgbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuMDEuMDkuMTkuZC4yMGRmIikKfQppZiAoIWV4aXN0cygic3JhLjAxLjA5LjE5LmQuMzBkZiIpKSB7CiAgbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuMDEuMDkuMTkuZC4zMGRmIikKfQoKc3JhLjAxLjA5LjE5LjE0Yy5kZiA8LSByYmluZCgKICBzcmEuMDEuMDkuMTkuZC4xMGRmLCAKICBzcmEuMDEuMDkuMTkuZC4yMGRmLCAKICBzcmEuMDEuMDkuMTkuZC4zMGRmKQoKdGVzdDIgPC0gbGFwcGx5KHNlcV9hbG9uZyh0ZXN0KSwgZnVuY3Rpb24oaSkgewogIGlmICghaXMubnVsbCh0ZXN0W1tpXV0pKSB7CiAgICBkZiA8LSBtZXJnZSgKICAgICAgdGVzdFtbaV1dICU+JSBzZWxlY3QoLXllYXIpLCAKICAgICAgc3BsaXQoc3JhLjAxLjA5LjE5LjE0Yy5kZiwgc3JhLjAxLjA5LjE5LjE0Yy5kZiRQTWVjbylbW2ldXSwKICAgICAgYnkgPSBjKCJQTWVjbyIsICJseXJfYm90IikpCiAgICBkcm9wcyA8LSB3aGljaChuYW1lcyhkZikgJWluJSBjKCJyZXAiLCAiQ19wY3QiLCAizpQxNEMiLCAiQ04iKSkKICAgIGRmWyAsIC1kcm9wc10KICB9Cn0pCm5hbWVzKHRlc3QyKSA8LSBuYW1lcyh0ZXN0KQp0ZXN0Mi5kZiA8LSBiaW5kX3Jvd3ModGVzdDIpCgpjb3JycGxvdCgKICBjb3IodGVzdDIuZGZbLCBjKDI6MjksIDMxOjQ1LCA0ODo0OSldLCB1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIiksIAogIG1ldGhvZCA9ICJudW1iZXIiLCB0eXBlID0gImZ1bGwiLCBudW1iZXIuY2V4ID0gLjYpCgojIHNwbGluZSBtaW4gZGF0YSwgd2VpZ2h0ZWQgYnkgbWFzcwojIG1pbi5zcC5scyA8LSBsYXBwbHkoc3JhLjIwMDkubHMsIGZ1bmN0aW9uKGRmKSB7CiMgICAgIGRmJGx5cl9ib3QgPC0gZGYkYm90dG9tLm1pbmVyYWwKIyAgICAgZGYkbHlyX3RvcCA8LSBkZiR0b3AubWluZXJhbAojICAgICBtaW5zIDwtIGMoIkFsby4uZy5rZy4iLCAiQWxwLi5nLmtnLiIsICJGZWQuLmcua2cuIiwgIkZlby4uZy5rZy4iLCAiU2FuZC4uZy5rZy4iLCAiQ2xheS4uZy5rZy4iLCAicEguSDJPLi4iKQojICAgICBkZi5sb25nIDwtIHBpdm90X2xvbmdlcigKIyAgICAgICBkZiwgCiMgICAgICAgY29scyA9IG1pbnMsCiMgICAgICAgbmFtZXNfdG8gPSAibWluIiwKIyAgICAgICB2YWx1ZXNfdG8gPSAiY29uY19na2ciKSAlPiUKIyAgICAgICBkYXRhLmZyYW1lCiMgICAgIGxhcHBseShzcGxpdChkZi5sb25nLCBkZi5sb25nJG1pbiksIGZ1bmN0aW9uKHgpCiMgICAgICAgd3RkLnNwLmZ4KHgsIHRhcmdldF92YXIgPSAiY29uY19na2ciLCB3ZWlnaHRfdmFyID0gIm1hc3Nfa2dtMiIpKQojIH0pCgojIGJsa0MucmVwLnNvYy5zcC4wMS5kZiA8LSBzcC5meChzcmEuMDEuYmxrQywgImx5cl9zb2MiLCAibHlyX3NvYyIsIHllYXIgPSAyMDAxKQpgYGAKCmBgYHtyIG1vZC1pbnB1dHN9CiMgc3RhcnQgd2l0aCBJbiA9IDEKaW4uMS5scyA8LSBsYXBwbHkodmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IDI3KSwgZnVuY3Rpb24oeCkgeCA8LSAxKQpgYGAKCmBgYHtyIG1vZC1meHN9CiMgbGFtYmRhICh0cnVlIGhhbGYtbGlmZSBvZiAxNEMpCmxhbWJkYSA8LSAxIC8gODI2NwoKIyBnZXQgaW5pdGlhbCBmbSB2YWx1ZSBmcm9tIGsgKHByZS1ib21iKQpmbSA8LSBmdW5jdGlvbiAoayl7CiAgay8oayArIGxhbWJkYSkKfQoKIyBnZXQgayBmcm9tIGluaXRpYWwgZm0gKHByZS1ib21iKQprIDwtIGZ1bmN0aW9uIChmbSkgewogIChmbSAqIGxhbWJkYSkvKDEgLSBmbSkKfQoKIyBzcGxpY2luZyBpbmRpY2VzCml4LjEwIDwtIHNlcSgxLCAyNywgMykKaXguMjAgPC0gc2VxKDIsIDI3LCAzKQppeC4zMCA8LSBzZXEoMywgMjcsIDMpCgojIEF0bSAxNEMgZm9yIHllYXJzIGluIHdoaWNoIGJ1bGsvcmVzcCAxNEMgYXJlIGtub3duCmF0bTE0Yy4wMS4wOS4xOSA8LSBkYXRhLmZyYW1lKAogIHllYXIgPSBjKDIwMDEsIDIwMDksIDIwMTkpLAogIGQxNGMgPSBjKG1lYW4oYXRtMTRjW3doaWNoKGF0bTE0YyRZZWFyLkFEID4gMjAwMSAmIGF0bTE0YyRZZWFyLkFEIDwgMjAwMiksICJEZWx0YTE0QyJdKSwKICAgICAgICAgICBtZWFuKGF0bTE0Y1t3aGljaChhdG0xNGMkWWVhci5BRCA+IDIwMDkgJiBhdG0xNGMkWWVhci5BRCA8IDIwMTApLCAiRGVsdGExNEMiXSksCiAgICAgICAgICAgbWVhbihhdG0xNGNbd2hpY2goYXRtMTRjJFllYXIuQUQgPiAyMDE5ICYgYXRtMTRjJFllYXIuQUQgPCAyMDIwKSwgIkRlbHRhMTRDIl0pKSkKCiMgY29uc3RyYWludCBkZiBmeApjb24uZGYuZnggPC0gZnVuY3Rpb24oUE1lY29fZGVwdGgsIGZpdF9MRiA9IEZBTFNFKSB7CiAgYnVsay5kZiA8LSBvYnMuYnVsay4xNGNbW1BNZWNvX2RlcHRoXV0KICByZXNwLmRmIDwtIG9icy5yZXNwLjE0Y1tbUE1lY29fZGVwdGhdXQogIGZwb20uZGYgPC0gb2JzLmZwb20uMTRjW1tQTWVjb19kZXB0aF1dCiAgCiAgaWYgKGZpdF9MRikgewogICAgcmVzcC5kZlt3aGljaChyZXNwLmRmJFBNZWNvID09ICJHUnJmIiksIF0KICB9CiAgCiAgcmV0dXJuKAogICAgY29uLmRmIDwtIGRhdGEuZnJhbWUocG9vbCA9IGMocmVwKCJidWxrQyIsIG5yb3coYnVsay5kZikpLCByZXAoInJlc3BpcmF0aW9uIiwgbnJvdyhyZXNwLmRmKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IGMoYnVsay5kZiRidWxrQywgcmVzcC5kZiRyZXNwKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPSBjKGJ1bGsuZGYkdGltZSwgcmVzcC5kZiR0aW1lKSkpCn0KCiMgQyBzdG9ja3MgZnVuY3Rpb24gKmFzc3VtZWQgbGFnIG5vdCBpbiAncGFycycqCnNvYy5meCA8LSBmdW5jdGlvbihwYXJzLCBtb2QsIEluLCBvdXQgPSAicG9vbHMiLCBtb2RfbWF0ID0gRkFMU0UpIHsKCiAgIyBzdGVhZHktc3RhdGUgc3RvY2sgY2FsYyBmeAogIGNhbGMuc29jIDwtIGZ1bmN0aW9uKEEsIGluX3ZlY3RvcikgewogICAgKC0xICogc29sdmUoQSkgJSolIGluX3ZlY3RvcikKICB9CiAgCiAgIyBtb2RlbCBtYXRyaWNlcwogIGlmIChtb2QgPT0gIjFwIikgewogICAgCiAgICAjIDFwIG1vZCBtYXRyaXgKICAgIEEgPC0gcGFycwogICAgCiAgICAjIDFwIHN0ZWFkeS1zdGF0ZSBzdG9ja3MKICAgIGluX3ZlY3RvciA8LSBJbgogICAgc3MuY3N0b2NrIDwtIHBhcnNeLTEgKiBpbl92ZWN0b3IKICAgIAogICAgIyBwb29sIG5hbWVzCiAgICBwbm1zIDwtICJidWxrQyIKICAgIAogIH0gZWxzZSBpZiAoZ3JlcGwoIjJwIiwgbW9kKSkgewogICAgCiAgICAjIHBvb2wgbmFtZXMKICAgIHBubXMgPC0gYygiZmFzdCIsICJzbG93IikKICAgIAogICAgIyAycHAgbW9kIG1hdHJpeAogICAgQSA8LSAtZGlhZyhwYXJzWzE6Ml0pCiAgICAKICAgICMgMnBwIHN0ZWFkeS1zdGF0ZSBDIHN0b2NrcwogICAgaW5fdmVjdG9yIDwtIGMoSW4gKiBwYXJzWzNdLCBJbiAqICgxIC0gcGFyc1szXSkpCiAgICBzcy5jc3RvY2sgPC0gY2FsYy5zb2MoQSwgaW5fdmVjdG9yKQogICAgCiAgICBpZiAobW9kID09ICIycHMiKSB7CiAgICAgIAogICAgICAjIDJwcyBtb2QgbWF0cml4CiAgICAgIEFbMiwgMV0gPC0gcGFyc1szXSAqIHBhcnNbMV0KICAgICAgCiAgICAgICMgMnBzIHN0ZWFkeS1zdGF0ZSBDIHN0b2NrcwogICAgICBpbl92ZWN0b3IgPC0gYyhJbiwgMCkKICAgICAgc3MuY3N0b2NrIDwtIGNhbGMuc29jKEEsIGluX3ZlY3RvcikKICAgIH0KICB9IGVsc2UgaWYgKGdyZXBsKCIzcCIsIG1vZCkpIHsKICAgIAogICAgIyBwb29sIG5hbWVzCiAgICBwbm1zIDwtIGMoImZhc3QiLCAic2xvdyIsICJwYXNzaXZlIikKICAgIAogICAgIyAzcHAgbW9kIG1hdHJpeAogICAgQSA8LSAtZGlhZyhwYXJzWzE6M10pCiAgICAKICAgICMgM3BwIHN0ZWFkeS1zdGF0ZSBDIHN0b2NrcwogICAgaW5fdmVjdG9yIDwtIGMoSW4gKiBwYXJzWzRdLCBJbiAqIHBhcnNbNV0sIEluICogKDEgLSBwYXJzWzRdIC0gcGFyc1s1XSkpCiAgICBzcy5jc3RvY2sgPC0gY2FsYy5zb2MoQSwgaW5fdmVjdG9yKQogICAgCiAgICBpZiAobW9kID09ICIzcHMiKSB7CiAgICAgIAogICAgICAjIDNwcyBtb2QgbWF0cml4CiAgICAgIEFbMiwgMV0gPC0gcGFyc1s0XSAqIHBhcnNbMV0KICAgICAgQVszLCAyXSA8LSBwYXJzWzVdICogcGFyc1syXSAKICAgICAgCiAgICAgICMgM3BzIHN0ZWFkeS1zdGF0ZSBDIHN0b2NrcwogICAgICBpbl92ZWN0b3IgPC0gYyhJbiwgMCwgMCkKICAgICAgc3MuY3N0b2NrIDwtIGNhbGMuc29jKEEsIGluX3ZlY3RvcikKICAgIH0KICB9CiAgCiAgaWYgKG91dCA9PSAic3VtIikgewogICAgc29jIDwtIHN1bShzcy5jc3RvY2spCiAgICBpZiAobW9kX21hdCkgewogICAgICBsaXN0KEFfbWF0ID0gQSwgaW5fdmVjdG9yID0gaW5fdmVjdG9yLCBzc19zb2MgPSBzb2MsIHBhcl9uYW1lcyA9IHBubXMpCiAgICB9IGVsc2UgewogICAgICBzb2MKICAgIH0KICB9IGVsc2UgewogICAgc29jIDwtIHNzLmNzdG9jawogICAgaWYgKG1vZF9tYXQpIHsKICAgICAgbGlzdChBX21hdCA9IEEsIGluX3ZlY3RvciA9IGluX3ZlY3Rvciwgc3Nfc29jID0gc29jLCBwYXJfbmFtZXMgPSBwbm1zKQogICAgfSBlbHNlIHsKICAgICAgc29jCiAgICB9CiAgfQp9CgojIG1vZGVsIGZ4Cm1vZEZ1biA8LSBmdW5jdGlvbihwYXJzLCBtb2QsIEluLCBsYWcgPSAwLCBwYXNzID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIG91dCA9ICJtb2RGaXQiLCBQTWVjb19kZXB0aCA9IE5VTEwsIHZhcl8xNGMgPSAiZDE0YyIsIGZpdF9sYWcgPSBGQUxTRSwgc2Vuc1IgPSBGQUxTRSkgewogIAogICMgZ2V0IGxhZywgc2V0IHBhcnMKICBpZiAoZml0X2xhZykgewogICAgaWYgKGdyZXBsKCIyIiwgbW9kKSkgewogICAgICBQQVJTIDwtIHBhcnNbMTozXQogICAgICBsYWcgPC0gcGFyc1s0XQogICAgfSBlbHNlIGlmIChncmVwbCgiMyIsIG1vZCkpIHsKICAgICAgUEFSUyA8LSBwYXJzWzE6NV0KICAgICAgbGFnIDwtIHBhcnNbNl0KICAgIH0gZWxzZSB7CiAgICAgICMgMXAKICAgICAgUEFSUyA8LSBwYXJzWzFdCiAgICAgIGxhZyA8LSBwYXJzWzJdCiAgICB9IAogIH0gZWxzZSB7CiAgICBQQVJTIDwtIHBhcnMKICAgIGxhZyA8LSBsYWcKICB9CiAgCiAgaWYgKHNlbnNSKSB7CiAgICBsYWcgPC0gMAogIH0KICAKICAjIHJ1biBzb2MuZnggdG8gZ2V0OiBtb2RfbWF0IFtbMV1dLCBpbl92ZWN0b3IgW1syXV0sIHN0ZWFkeS1zdGF0ZSBDIFtbM11dLCBhbmQgcG9vbCBuYW1lcyBbWzRdXQogIHNvYy5meF9vdXQgPC0gc29jLmZ4KFBBUlMsIG1vZCwgSW4sIG1vZF9tYXQgPSBUUlVFKQogIHNzLmNzdG9jayA8LSBzb2MuZnhfb3V0W1szXV0KICAKICAjIGNoZWNrIGZvciBuZWdhdGl2ZSBzdG9ja3MKICBpZiAoYW55KHNzLmNzdG9jayA8PSAwKSkgewogICAgY2F0KCJwb29sICIsIHdoaWNoKHNzLmNzdG9jayA8PSAwKSwgIjwgMFxuIikKICB9CiAgCiAgIyB0aW1lIGluZGV4CiAgaXgudCA8LSBjKChsYWcgKyAxKTpucm93KERhdG0pKQogIAogICMgY2hlY2sgZm9yIDFwIG1vZAogIGlmIChtb2QgPT0gIjFwIikgewogICAgCiAgICAjIG1vZGVsCiAgICBtb2RlbCA8LSBPbmVwTW9kZWwxNCgKICAgICAgdCA9IERhdG0kRGF0ZVtpeC50XSwKICAgICAgayA9IHNvYy5meF9vdXRbWzFdXSwKICAgICAgQzAgPSBhcy52ZWN0b3Ioc3MuY3N0b2NrKSwKICAgICAgRjBfRGVsdGExNEMgPSBEZWx0YTE0Q19mcm9tX0Fic29sdXRlRnJhY3Rpb25Nb2Rlcm4oZm0oc29jLmZ4X291dFtbMV1dKSksCiAgICAgIEluID0gc29jLmZ4X291dFtbMl1dLAogICAgICBpbnB1dEZjID0gRGF0bSwKICAgICAgbGFnID0gbGFnLAogICAgICBwYXNzID0gcGFzcykKICAgIAogIH0gZWxzZSB7CiAgICAKICAgICMgY2FsY3VsYXRlIGluaXRpYWwgMTRDCiAgICBGMF9EZWx0YTE0QyA8LSB1bmxpc3QoCiAgICAgIGxhcHBseSgtZGlhZyhzb2MuZnhfb3V0W1sxXV0pLCBmdW5jdGlvbih4KSBEZWx0YTE0Q19mcm9tX0Fic29sdXRlRnJhY3Rpb25Nb2Rlcm4oZm0oeCkpKSkKICAgIAogICAgIyBtdWx0aXBvb2wgbW9kZWwgZngKICAgIG1vZC5meCA8LSBmdW5jdGlvbihBLAogICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgaW5fdmVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgIEMwLAogICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDLCAKICAgICAgICAgICAgICAgICAgICAgICB4aSA9IDEsICMgdGltZXN0ZXAKICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZjLCAKICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSBsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IHBhc3MpIHsKICAgICAgdF9zdGFydCA9IG1pbih0KQogICAgICB0X3N0b3AgPSBtYXgodCkKICAgICAgaW5wdXRGbHV4ZXMgPSBCb3VuZEluRmx1eGVzKGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIG1hdHJpeChucm93ID0gbGVuZ3RoKGluX3ZlY3RvciksIG5jb2wgPSAxLCBpbl92ZWN0b3IpCiAgICAgICAgfSwgdF9zdGFydCwgdF9zdG9wKQogICAgICBpZiAobGVuZ3RoKHhpKSA9PSAxKSAKICAgICAgICBmWCA9IGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHhpCiAgICAgICAgfQogICAgICBBdCA9IEJvdW5kTGluRGVjb21wT3AobWFwID0gZnVuY3Rpb24odCkgewogICAgICAgIGZYKHQpICogQQogICAgICB9LCB0X3N0YXJ0LCB0X3N0b3ApCiAgICAgIEZjID0gQm91bmRGYyhpbnB1dEZjLCBsYWcgPSBsYWcsIGZvcm1hdCA9ICJEZWx0YTE0QyIpCiAgICAgIG1vZCA9IE1vZGVsXzE0KHQsIEF0LCBpdkxpc3QgPSBDMCwgaW5pdGlhbFZhbEYgPSBDb25zdEZjKEYwX0RlbHRhMTRDLCAiRGVsdGExNEMiKSwgCiAgICAgICAgICAgICAgICAgICAgIGlucHV0Rmx1eGVzID0gaW5wdXRGbHV4ZXMsIGlucHV0RmMgPSBGYywgcGFzcyA9IHBhc3MpCiAgICB9CiAgICAKICAgICMgcnVuIG1vZGVsCiAgICBtb2RlbCA8LSBtb2QuZngoCiAgICAgIEEgPSBzb2MuZnhfb3V0W1sxXV0sCiAgICAgIHQgPSBEYXRtJERhdGVbaXgudF0sCiAgICAgIGluX3ZlY3RvciA9IHNvYy5meF9vdXRbWzJdXSwKICAgICAgQzAgPSBhcy52ZWN0b3Ioc3MuY3N0b2NrKSwKICAgICAgRjBfRGVsdGExNEMgPSBGMF9EZWx0YTE0QywKICAgICAgaW5wdXRGYyA9IERhdG0sCiAgICAgIGxhZyA9IGxhZywKICAgICAgcGFzcyA9IHBhc3MpIAogIH0KCiAgIyBnZXQgbW9kIHZhbHVlcwogIEMxNG0gPC0gZ2V0RjE0Qyhtb2RlbCkKICBDMTRwIDwtIGdldEYxNChtb2RlbCkgCiAgQzE0ciA8LSBnZXRGMTRSKG1vZGVsKQogIEN0b3QgPC0gZ2V0Qyhtb2RlbCkKICAKICBpZiAodmFyXzE0YyA9PSAiZm0iKSB7CiAgICBkYXRlcyA8LSBEYXRtJERhdGVbaXgudF0KICAgIGZvciAoaSBpbiBzZXFfYWxvbmcoZGF0ZXMpKSB7CiAgICAgIEMxNG1baV0gPC0gY29udmVydF9mbV9kMTRjKGQxNGMgPSBDMTRtW2ldLCBvYnNfZGF0ZV95ID0gZGF0ZXNbaV0sIHZlcmJvc2UgPSBGQUxTRSkgCiAgICAgIEMxNHBbaV0gPC0gY29udmVydF9mbV9kMTRjKGQxNGMgPSBDMTRwW2ldLCBvYnNfZGF0ZV95ID0gZGF0ZXNbaV0sIHZlcmJvc2UgPSBGQUxTRSkgCiAgICAgIEMxNHJbaV0gPC0gY29udmVydF9mbV9kMTRjKGQxNGMgPSBDMTRyW2ldLCBvYnNfZGF0ZV95ID0gZGF0ZXNbaV0sIHZlcmJvc2UgPSBGQUxTRSkKICAgIH0KICB9CiAgCiAgaWYgKG91dCA9PSAibW9kRml0IikgewogICAgIyBkYXRhZnJhbWUgZm9yIG1vZEZpdCBmeAogICAgZGF0YS5mcmFtZSgKICAgICAgdGltZSA9IERhdG0kRGF0ZVtpeC50XSwKICAgICAgcmVzcCA9IEMxNHIsCiAgICAgIGJ1bGtDID0gQzE0bSwKICAgICAgY1N0b2NrID0gc3VtKEN0b3RbMSwgXSkpCiAgfSBlbHNlIHsKICAgIAogICAgIyBzdW0gYyBzdG9ja3MKICAgIHNzLmNzdG9jayA8LSByb3VuZChzcy5jc3RvY2ssIDIpCiAgICBjc3RvY2suc3VtIDwtIGlmZWxzZShpcy5udWxsKGRpbShzcy5jc3RvY2spKSwgc3MuY3N0b2NrLCBjb2xTdW1zKHNzLmNzdG9jaykpCiAgICAKICAgIGlmICh2ZXJib3NlKSB7CiAgICAgICMgcHJpbnQgc2l0ZSBhbmQgc3RlYWR5LXN0YXRlIHN0b2NrcwogICAgICBpZiAoIWlzLm51bGwoUE1lY29fZGVwdGgpKSBjYXQocGFzdGUwKFBNZWNvX2RlcHRoLCAiXG4iKSkKICAgICAgZm9yIChpIGluIHNlcV9hbG9uZyhzcy5jc3RvY2spKSB7CiAgICAgICAgY2F0KHBhc3RlKHNvYy5meF9vdXRbWzRdXVtpXSwgc3MuY3N0b2NrW2ldLCAiXG4iKSkKICAgICAgfQogICAgICBjYXQoY3N0b2NrLnN1bSwgIiAobW9kZWxlZCB0b3RhbCBDIHN0b2NrKVxuIikKICAgICAgaWYgKCFpcy5udWxsKFBNZWNvX2RlcHRoKSkgewogICAgICAgIGNhdChyb3VuZChjc29jLjE5LjBfMzBbW1BNZWNvX2RlcHRoXV1bICwgImx5cl9zb2MiXSwgMSksICIgKG1lYXN1cmVkIHRvdGFsIEMgc3RvY2spXG4iKQogICAgICAgIGlmIChjc3RvY2suc3VtIDwgY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsICJseXJfc29jX2x3ciJdKSBjYXQoIk1vZGVsZWQgc3RvY2tzIHRvbyBsb3cgdy8gY3VycmVudCBpbnB1dHNcbiIpIGVsc2UKICAgICAgICAgIGlmIChjc3RvY2suc3VtID4gY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsICJseXJfc29jX3VwciJdKSBjYXQoIk1vZGVsZWQgc3RvY2tzIHRvbyBoaWdoIHcvIGN1cnJlbnQgaW5wdXRzXG4iKQogICAgICB9CiAgICB9CiAgICAKICAgICMgZGF0YSBmcmFtZSBmb3IgcGxvdHRpbmcKICAgIGRhdGEuZnJhbWUoCiAgICAgIHllYXJzID0gcmVwKERhdG0kRGF0ZVtpeC50XSwgKG5jb2woQzE0cCkgKyAzKSksCiAgICAgIGQxNEMgPSBjKGMoQzE0cCksCiAgICAgICAgICAgICAgIEMxNG0sCiAgICAgICAgICAgICAgIEMxNHIsCiAgICAgICAgICAgICAgIERhdG0kZDE0Y1tpeC50XSksCiAgICAgIHBvb2wgPSByZXAoYyhzb2MuZnhfb3V0W1s0XV0sICJidWxrQyIsICJyZXNwaXJhdGlvbiIsICJhdG0iKSwgCiAgICAgICAgICAgICAgICAgZWFjaCA9IG5yb3coQzE0cCkpKSAlPiUKICAgICAgZGlzdGluY3QKICB9Cn0KYGBgCgpgYGB7ciBtb2QtcGxvdC1meH0KQzE0LnBsb3QuZnggPC0gZnVuY3Rpb24ocGxvdC5kZiwgY29uLmRmLCBtb2QsIHBvb2xfZmlsdGVyID0gTlVMTCwgUE1lY29fZGVwdGgpIHsKICAgIAogICMgc2V0IGxpbmUgYW5kIGNvbG9yIHZhbHVlcwogIGN2YWxzIDwtIGMoImF0bSIgPSA4LCAiZmFzdCIgPSAiI2U0MWY4OCIsICJzbG93IiA9ICIjMWY4OGU0IiwgInBhc3NpdmUiID0gIiMxZmU0N2IiLCAicmVzcGlyYXRpb24iID0gIiNlNDdiMWYiLCAiYnVsa0MiID0gImJsYWNrIikKICBsdmFscyA8LSBjKCJhdG0iID0gMSwgImZhc3QiID0gMiwgInNsb3ciID0gMiwgInBhc3NpdmUiID0gMiwgInJlc3BpcmF0aW9uIiA9IDEsICJidWxrQyIgPSAxKQogIAogICMgZmlsdGVyIHBvb2xzIGFzIGRlc2lyZWQKICBpZiAoIWlzLm51bGwocG9vbF9maWx0ZXIpKSB7CiAgICBwbG90LmRmIDwtIHBsb3QuZGZbd2hpY2gocGxvdC5kZiRwb29sICVpbiUgcG9vbF9maWx0ZXIpLCBdCiAgfQogIAogICMgcGxvdAogIHBsb3QuZGYgJT4lCiAgICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDKSkgKwogICAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBvb2wsIGxpbmV0eXBlID0gcG9vbCkpICsKICAgIGdlb21fcG9pbnQoZGF0YSA9IGNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG9vbCksIHNpemUgPSAzKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQb29sIiwgdmFsdWVzID0gY3ZhbHMsIGxpbWl0cyA9IGZvcmNlKSArCiAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gbHZhbHMpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgICBnZ3RpdGxlKHBhc3RlKFBNZWNvX2RlcHRoLCBtb2QpKSArCiAgICB4bGFiKCJZZWFyIikgKwogICAgeWxhYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICAgIGd1aWRlcyhsaW5ldHlwZSA9ICJub25lIikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQp9CmBgYAoKIyBMb2FkIGluaXRpYWwgcGFyYW1ldGVyIGxpc3RzICgxcCwgMnBwLCAycHMsIDNwcCwgM3BzKQpgYGB7ciBwYXJzLWktMXB9CmlmICghZXhpc3RzKCJwYXJzLmkuMXAiKSkgewogIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9wYXJzLmkuMXAuUkRhdGEiKQp9CmlmICghZXhpc3RzKCJwYXJzLmkuMnBwIikpIHsKICBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvcGFycy5pLjJwcC5SRGF0YSIpCn0KaWYgKCFleGlzdHMoInBhcnMuaS4ycHMiKSkgewogIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9wYXJzLmkuMnBzLlJEYXRhIikKfQppZiAoIWV4aXN0cygicGFycy5pLjNwcCIpKSB7CiAgbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL3BhcnMuaS4zcHAuUkRhdGEiKQp9CmlmICghZXhpc3RzKCJwYXJzLmkuM3BzIikpIHsKICBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvcGFycy5pLjNwcy5SRGF0YSIpCn0KYGBgCgojIG1vZEZpdCBwYXJhbWV0ZXIgb3B0aW1pemF0aW9uCgpgYGB7ciBtb2RGaXQtZngtbXVsdGlwb29sfQptb2QuZml0cy5meCA8LSBmdW5jdGlvbihwYXJzLCBtb2QsIEluLCBzdWIsIGxhZywgdXBwZXIsIGxvd2VyLCBjb3N0LCBtYXhpdCA9IDUwMCwgbWV0aG9kID0gIk5lbGRlci1NZWFkIiwgdmFyXzE0YyA9ICJkMTRjIiwgZml0X2xhZyA9IEZBTFNFLCAuLi4pIHsKICAKICBpZiAodmFyXzE0YyA9PSAiZDE0YyIpIHsKICAgIG9icy5idWxrIDwtIG9icy5idWxrLjE0YwogICAgb2JzLnJlc3AgPC0gb2JzLnJlc3AuMTRjCiAgfSBlbHNlIHsKICAgIG9icy5idWxrIDwtIG9icy5idWxrLmZtCiAgICBvYnMucmVzcCA8LSBvYnMucmVzcC5mbQogIH0KICAKICAjIHN0YXJ0IGxvb3AKICBsYXBwbHkoc2VxX2Fsb25nKHBhcnNbc3ViXSksIGZ1bmN0aW9uKGkpIHsKICAgIAogICAgIyBzdGFydCB0aW1lciBhbmQgcHJpbnQgUE1lY29fZGVwdGgKICAgIHN0YXJ0IDwtIFN5cy50aW1lKCkKICAgIGNhdChwYXN0ZTAobmFtZXMocGFycylbc3ViXVtpXSwgIiBwYXJhbWV0ZXIgZml0dGluZ1xuIikpCiAgICAKICAgICMgc2V0IHZhcnMKICAgIFBNZWNvX2RlcHRoIDwtIG5hbWVzKHBhcnMpW3N1Yl1baV0KICAgIFBBUlMgPC0gcGFyc1tzdWJdW1tpXV0KICAgIAogICAgIyBTZXQgaW5wdXQKICAgIEluIDwtIEluW3N1Yl1bW2ldXQogICAgCiAgICAjIGRlZmluZSBjb3N0IGZ1bmN0aW9uCiAgICBpZiAoY29zdCA9PSAiMTRDICsgY1N0b2NrIikgewogICAgICBtb2QuQ29zdCA8LSBmdW5jdGlvbihQQVJTKSB7CiAgICAgICAgbW9kZWxPdXRwdXQgPC0gbW9kRnVuKFBBUlMsIG1vZCwgSW4sIGxhZywgdmVyYm9zZSA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyXzE0YyA9IHZhcl8xNGMsIGZpdF9sYWcgPSBmaXRfbGFnKQogICAgICAgIGNvc3QxIDwtIG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLmJ1bGtbc3ViXVtbaV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlVmFyID0gVFJVRSkKICAgICAgICBjb3N0MiA8LSBtb2RDb3N0KG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5yZXNwW3N1Yl1bW2ldXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVZhciA9IFRSVUUsIGNvc3QgPSBjb3N0MSkgCiAgICAgICAgY29zdDMgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuY1N0b2NrW3N1Yl1bW2ldXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0ID0gY29zdDIpCiAgICAgICAgaWYgKG1vZCA9PSAiMXAiKSB7CiAgICAgICAgICBjb3N0MyRtb2RlbAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb3N0MwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChjb3N0ID09ICIxNEMiKSB7CiAgICAgIG1vZC5Db3N0IDwtIGZ1bmN0aW9uKFBBUlMpIHsKICAgICAgICBtb2RlbE91dHB1dCA8LSBtb2RGdW4oUEFSUywgbW9kLCBJbiwgbGFnLCB2ZXJib3NlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfMTRjID0gdmFyXzE0YywgZml0X2xhZyA9IGZpdF9sYWcpCiAgICAgICAgY29zdDEgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuYnVsa1tzdWJdW1tpXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYXIgPSBUUlVFKQogICAgICAgIGNvc3QyIDwtIG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLnJlc3Bbc3ViXVtbaV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVWYXIgPSBUUlVFLCBjb3N0ID0gY29zdDEpCiAgICAgICAgaWYgKG1vZCA9PSAiMXAiICYmICFmaXRfbGFnKSB7CiAgICAgICAgICBjb3N0MiRtb2RlbAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb3N0MgogICAgICAgIH0KICAgICAgfSAKICAgIH0KICAgIAogICAgIyBzZXQgY29udHJvbCBsaXN0IGZvciBvcHRpbSBtZXRob2QKICAgIGlmIChtZXRob2QgPT0gIk5lbGRlci1NZWFkIikgewogICAgICBjdGwgPC0gbGlzdChtYXhpdCA9IG1heGl0KQogICAgfSBlbHNlIHsKICAgICAgY3RsIDwtIE5VTEwKICAgIH0KICAgIAogICAgIyBmaXQgcGFycwogICAgaWYgKG1vZCA9PSAiMXAiICYmICFmaXRfbGFnKSB7CiAgICAgIAogICAgICAjIHNpbmdsZSBwYXIgb3B0aW1pemF0aW9uCiAgICAgIG9wdCA8LSBvcHRpbShwYXIgPSBQQVJTLAogICAgICAgICAgICAgICAgICAgZm4gPSBtb2QuQ29zdCwKICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJCcmVudCIsCiAgICAgICAgICAgICAgICAgICBsb3dlciA9IDAsCiAgICAgICAgICAgICAgICAgICB1cHBlciA9IDEsCiAgICAgICAgICAgICAgICAgICBoZXNzaWFuID0gVFJVRSkgIAogICAgICAKICAgICAgIyByZW5hbWUgInZhbHVlIiB0byBzc3IKICAgICAgbmFtZXMob3B0KVt3aGljaChuYW1lcyhvcHQpID09ICJ2YWx1ZSIpXSA8LSAic3NyIgogICAgICAKICAgICAgIyByZXRyaWV2ZSB2YXJpYW5jZSBhbmQgcmVzaWR1YWxzIGZyb20gbW9kLkNvc3QKICAgICAgbW9kZWxPdXRwdXQgPC0gbW9kRnVuKFBBUlMsIG1vZCwgSW4sIGxhZywgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyXzE0YyA9IHZhcl8xNGMsIGZpdF9sYWcgPSBmaXRfbGFnKQogICAgICBjb3N0MSA8LSBtb2RDb3N0KAogICAgICAgIG1vZGVsID0gbW9kZWxPdXRwdXQsIG9icyA9IG9icy5idWxrW1tpXV0sIHNjYWxlVmFyID0gVFJVRSkKICAgICAgY29zdDIgPC0gbW9kQ29zdCgKICAgICAgICBtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMucmVzcFtbaV1dLCBzY2FsZVZhciA9IFRSVUUsIAogICAgICAgIGNvc3QgPSBjb3N0MSkKICAgICAgbW9kLkNvc3QudmFyIDwtIGNvc3QyJHZhcgogICAgICBtb2QuQ29zdC5yZXMgPC0gY29zdDIkcmVzaWR1YWxzCiAgICAgIAogICAgICAjIGFkZCB0byBvcHQgYW5kIHJldHVybgogICAgICBvcHQkdmFyX21zIDwtIG1vZC5Db3N0LnZhciRTU1IgKiBtb2QuQ29zdC52YXIkc2NhbGUKICAgICAgbmFtZXMob3B0JHZhcl9tcykgPC0gYygicmVzcCIsICJidWxrQyIpCiAgICAgIG9wdCRvYnMubW9kIDwtIG1vZC5Db3N0LnJlc1sgLCBjKCJvYnMiLCAibW9kIiwgIm5hbWUiKV0KICAgICAgb3B0JGRmLnJlc2lkdWFsIDwtIG5yb3cobW9kLkNvc3QucmVzKSAtIGxlbmd0aChrKSAtIDEKICAgICAgb3B0JHJlc2lkdWFscyA8LSBtb2QuQ29zdC5yZXMkcmVzCiAgICAgIG5hbWVzKG9wdCRyZXNpZHVhbHMpIDwtIG1vZC5Db3N0LnJlcyRuYW1lCiAgICAgIAogICAgICAjIHJldHVybgogICAgICBvcHQKICAgICAgCiAgICB9IGVsc2UgewogICAgICAKICAgICAgIyBtdWx0aXBvb2wgZml0CiAgICAgIGZpdCA8LSB0cnlDYXRjaCgKICAgICAgICBtb2RGaXQoZiA9IG1vZC5Db3N0LAogICAgICAgICAgICAgICBwID0gUEFSUywKICAgICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kLAogICAgICAgICAgICAgICBsb3dlciA9IGxvd2VyLAogICAgICAgICAgICAgICB1cHBlciA9IHVwcGVyLAogICAgICAgICAgICAgICBjb250cm9sID0gY3RsKSwKICAgICAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KSAKICAgICAgCiAgICAgICMgcGFyYW1ldGVyIHNlbnNpdGl2aXR5CiAgICAgIFNmdW4gPC0gc2Vuc0Z1bihtb2QuQ29zdCwgZml0JHBhcikKICAgICAgICAgIAogICAgICAjIEVuZCB0aW1lciBhbmQgcHJpbnQgZWxhcHNlZCB0aW1lCiAgICAgIGVuZCA8LSBTeXMudGltZSgpCiAgICAgIGNhdChwYXN0ZTAoInRpbWU6ICIsIGVuZCAtIHN0YXJ0LCAiXG4iKSkKICAgIAogICAgICAjIFJldHVybiBmaXR0ZWQgcGFyYW1ldGVycyBhbmQgc2Vuc2l0aXZpdHkKICAgICAgbGlzdChtb2RmaXQgPSBmaXQsIHNlbnMgPSBTZnVuKQogICAgfQogIH0pIAp9CmBgYAoKYGBge3IgbW9kRml0LTFwLCBldmFsID0gRkFMU0V9CiMgMXAKbW9kLmZpdHMuMXAgPC0gbW9kLmZpdHMuZngoCiAgcGFycyA9IHBhcnMuaS4xcCwKICBtb2QgPSAiMXAiLAogIEluID0gaW4uMS5scywKICBzdWIgPSAxOjI3LAogIGxhZyA9IDAsCiAgdXBwZXIgPSAxLAogIGxvd2VyID0gMCwKICBjb3N0ID0gIjE0QyIKKQpuYW1lcyhtb2QuZml0cy4xcCkgPC0gbmFtZXMocGFycy5pLjFwKQpzYXZlKG1vZC5maXRzLjFwLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjFwIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJEYXRhIikpCgojIyBjaGVjayBmb3IgY29udmVyZ2VuY2UKIyBtYXggaXRlcmF0aW9ucyBjaGVjazoKY3ZnMSA8LSB3aGljaCh1bmxpc3QobGFwcGx5KG1vZC5maXRzLjFwLCAiW1siLCAiY29udmVyZ2VuY2UiKSkgPT0gMSkgIyBhbGwgPSAwCiMgZGVnZW5lcmFjeSBjaGVjazoKY3ZnMTAgPC0gd2hpY2godW5saXN0KGxhcHBseShtb2QuZml0cy4xcCwgIltbIiwgImNvbnZlcmdlbmNlIikpID09IDEwKSAjIGFsbCA9IDAKCiMjIHcvIGxhZwpwYXJzLmkuMXAubGFnIDwtIGxhcHBseShwYXJzLmkuMXAsIGZ1bmN0aW9uKHgpIGMoeCwgMTApKQptb2QuZml0cy4xcC5sYWcgPC0gbW9kLmZpdHMuZngoCiAgcGFycyA9IHBhcnMuaS4xcC5sYWcsCiAgbW9kID0gIjFwIiwKICBJbiA9IGluLjEubHMsCiAgc3ViID0gMToyNywKICB1cHBlciA9IGMoMSwgMTAwKSwKICBsb3dlciA9IGMoMCwgMCksCiAgY29zdCA9ICIxNEMiLAogIGZpdF9sYWcgPSBUUlVFCikKbmFtZXMobW9kLnNlbnMuZml0cy4xcC5sYWcpIDwtIG5hbWVzKHBhcnMuaS4xcC5sYWcpCnNhdmUobW9kLnNlbnMuZml0cy4xcC5sYWcsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLnNlbnMuZml0cy4xcC5sYWciLCAiXyIsIFN5cy5EYXRlKCksICIuUkRhdGEiKSkKCiMjIGNoZWNrIGZvciBjb252ZXJnZW5jZQojIG1heCBpdGVyYXRpb25zIGNoZWNrOgpjdmcxIDwtIHdoaWNoKHVubGlzdChsYXBwbHkobGFwcGx5KG1vZC5maXRzLjFwLmxhZywgIltbIiwgMSksICJbWyIsICJjb252ZXJnZW5jZSIpKSA9PSAxKQojIGRlZ2VuZXJhY3kgY2hlY2s6CmN2ZzEwIDwtIHdoaWNoKHVubGlzdChsYXBwbHkobGFwcGx5KG1vZC5maXRzLjFwLmxhZywgIltbIiwgMSksICJbWyIsICJjb252ZXJnZW5jZSIpKSA9PSAxMCkKY3ZnMTAucmVkbyA8LSBtb2QuZml0cy5meCgKICBwYXJzID0gcGFycy5pLjFwLmxhZywKICBtb2QgPSAiMXAiLAogIEluID0gaW4uMS5scywKICBzdWIgPSBjdmcxMCwKICB1cHBlciA9IGMoMSwgMTAwKSwKICBsb3dlciA9IGMoMCwgMCksCiAgbWV0aG9kID0gIkJGR1MiLAogIGNvc3QgPSAiMTRDIiwKICBmaXRfbGFnID0gVFJVRQopCm5hbWVzKGN2ZzEwLnJlZG8pIDwtIG5hbWVzKG1vZC5maXRzLjFwLmxhZ1tjdmcxMF0pCm1vZC5maXRzLjFwLmxhZ1tjdmcxMF0gPC0gY3ZnMTAucmVkbwpzYXZlKG1vZC5maXRzLjFwLmxhZywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4xcC5sYWciLCAiXyIsIFN5cy5EYXRlKCksICIuUkRhdGEiKSkKYGBgCgpgYGB7ciBtb2RGaXQtMnAsIGV2YWwgPSBGQUxTRX0KIyAycAojIyBwYXJhbGxlbAptb2Quc2Vucy5maXRzLjJwcCA8LSBtb2QuZml0cy5meCgKICBwYXJzID0gcGFycy5pLjJwcCwKICBtb2QgPSAiMnBwIiwKICBJbiA9IGluLjEubHMsCiAgc3ViID0gMToyNywKICBsYWcgPSAwLAogIHVwcGVyID0gYygxLCAxLCAxKSwKICBsb3dlciA9IGMoMCwgMCwgMCksCiAgY29zdCA9ICIxNEMiCikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHApIDwtIG5hbWVzKHBhcnMuaS4ycHApCnNhdmUobW9kLnNlbnMuZml0cy4ycHAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLnNlbnMuZml0cy4ycHAiLCAiXyIsIFN5cy5EYXRlKCksICIuUkRhdGEiKSkKCiMjIGNoZWNrIGZvciBjb252ZXJnZW5jZQojIG1heCBpdGVyYXRpb25zIGNoZWNrOgpjdmcxIDwtIHdoaWNoKHVubGlzdChsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAsICJbWyIsICJjb252ZXJnZW5jZSIpKSA9PSAxKQojIGRlZ2VuZXJhY3kgY2hlY2s6CmN2ZzEwIDwtIHdoaWNoKHVubGlzdChsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAsICJbWyIsICJjb252ZXJnZW5jZSIpKSA9PSAxMCkKCiMjIyB3LyBsYWcKcGFycy5pLjJwcC5sYWcgPC0gbGFwcGx5KHBhcnMuaS4ycHAsIGZ1bmN0aW9uKHgpIGMoeCwgMTApKQptb2Quc2Vucy5maXRzLjJwcC5sYWcgPC0gbW9kLmZpdHMuZngoCiAgcGFycyA9IHBhcnMuaS4ycHAubGFnLAogIG1vZCA9ICIycHAiLAogIEluID0gaW4uMS5scywKICBzdWIgPSAxOjI3LAogIHVwcGVyID0gYygxLCAxLCAxLCAxMDApLAogIGxvd2VyID0gYygwLCAwLCAwLCAwKSwKICBjb3N0ID0gIjE0QyIsCiAgZml0X2xhZyA9IFRSVUUKKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcC5sYWcpIDwtIG5hbWVzKHBhcnMuaS4ycHApCnNhdmUobW9kLnNlbnMuZml0cy4ycHAubGFnLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5zZW5zLmZpdHMuMnBwLmxhZyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SRGF0YSIpKQoKIyMgY2hlY2sgZm9yIGNvbnZlcmdlbmNlCiMgbWF4IGl0ZXJhdGlvbnMgY2hlY2s6CmN2ZzEgPC0gd2hpY2godW5saXN0KGxhcHBseShtb2Quc2Vucy5maXRzLjJwcC5sYWcsICJbWyIsICJjb252ZXJnZW5jZSIpKSA9PSAxKQojIGRlZ2VuZXJhY3kgY2hlY2s6CmN2ZzEwIDwtIHdoaWNoKHVubGlzdChsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAubGFnLCAiW1siLCAiY29udmVyZ2VuY2UiKSkgPT0gMTApCgoKIyMgc2VyaWVzCm1vZC5zZW5zLmZpdHMuMnBzIDwtIG1vZC5maXRzLmZ4KAogIHBhcnMgPSBwYXJzLmkuMnBzLAogIG1vZCA9ICIycHMiLAogIEluID0gaW4uMS5scywKICBzdWIgPSAxOjI3LAogIGxhZyA9IDAsCiAgdXBwZXIgPSBjKDEsIDEsIDEpLAogIGxvd2VyID0gYygwLCAwLCAwKSwKICBjb3N0ID0gIjE0QyIKKQpuYW1lcyhtb2Quc2Vucy5maXRzLjJwcykgPC0gbmFtZXMocGFycy5pLjJwcykKc2F2ZShtb2Quc2Vucy5maXRzLjJwcywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2Quc2Vucy5maXRzLjJwcyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SRGF0YSIpKQoKIyMgY2hlY2sgZm9yIGNvbnZlcmdlbmNlCiMgbWF4IGl0ZXJhdGlvbnMgY2hlY2s6CmN2ZzEgPC0gd2hpY2godW5saXN0KGxhcHBseShtb2Quc2Vucy5maXRzLjJwcywgIltbIiwgImNvbnZlcmdlbmNlIikpID09IDEpCiMgZGVnZW5lcmFjeSBjaGVjazoKY3ZnMTAgPC0gd2hpY2godW5saXN0KGxhcHBseShtb2Quc2Vucy5maXRzLjJwcywgIltbIiwgImNvbnZlcmdlbmNlIikpID09IDEwKQoKIyMjIHcvIGxhZwpwYXJzLmkuMnBzLmxhZyA8LSBsYXBwbHkocGFycy5pLjJwcywgZnVuY3Rpb24oeCkgYyh4LCAxMCkpICMgc3RhcnQgdy8gMTAgeXIKbW9kLnNlbnMuZml0cy4ycHMubGFnIDwtIG1vZC5maXRzLmZ4KAogIHBhcnMgPSBwYXJzLmkuMnBzLmxhZywKICBtb2QgPSAiMnBzIiwKICBJbiA9IGluLjEubHMsCiAgc3ViID0gMToyNywKICB1cHBlciA9IGMoMSwgMSwgMSwgMTAwKSwKICBsb3dlciA9IGMoMCwgMCwgMCwgMCksCiAgY29zdCA9ICIxNEMiLAogIGZpdF9sYWcgPSBUUlVFCikKbmFtZXMobW9kLnNlbnMuZml0cy4ycHMubGFnKSA8LSBuYW1lcyhwYXJzLmkuMnBzKQpzYXZlKG1vZC5zZW5zLmZpdHMuMnBzLmxhZywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2Quc2Vucy5maXRzLjJwcy5sYWciLCAiXyIsIFN5cy5EYXRlKCksICIuUkRhdGEiKSkKCiMjIGNoZWNrIGZvciBjb252ZXJnZW5jZQojIG1heCBpdGVyYXRpb25zIGNoZWNrOgpjdmcxIDwtIHdoaWNoKHVubGlzdChsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMubGFnLCAiW1siLCAiY29udmVyZ2VuY2UiKSkgPT0gMSkKIyBkZWdlbmVyYWN5IGNoZWNrOgpjdmcxMCA8LSB3aGljaCh1bmxpc3QobGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLmxhZywgIltbIiwgImNvbnZlcmdlbmNlIikpID09IDEwKQpgYGAKCmBgYHtyIG1vZEZpdC0zcCwgZXZhbCA9IEZBTFNFfQojIDNwCiMjIHBhcmFsbGVsCm1vZC5zZW5zLmZpdHMuM3BwIDwtIG1vZC5maXRzLmZ4KAogIHBhcnMgPSBwYXJzLmkuM3BwLAogIG1vZCA9ICIzcHAiLAogIEluID0gaW4uMS5scywKICBzdWIgPSAxOjI3LAogIHVwcGVyID0gYygxLCAxLCAxLCAxLCAxKSwKICBsb3dlciA9IGMoMCwgMCwgMCwgMCwgMCksCiAgY29zdCA9ICIxNEMiLAogIGxhZyA9IDAsCiAgZml0X2xhZyA9IEZBTFNFCikKbmFtZXMobW9kLnNlbnMuZml0cy4zcHApIDwtIG5hbWVzKHBhcnMuaS4zcHApCnNhdmUobW9kLnNlbnMuZml0cy4zcHAsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLnNlbnMuZml0cy4zcHAiLCAiXyIsIFN5cy5EYXRlKCksICIuUkRhdGEiKSkKCiMjIGNoZWNrIGZvciBjb252ZXJnZW5jZQojIG1heCBpdGVyYXRpb25zIGNoZWNrOgpjdmcxIDwtIHdoaWNoKHVubGlzdChsYXBwbHkobW9kLnNlbnMuZml0cy4zcHAsICJbWyIsICJjb252ZXJnZW5jZSIpKSA9PSAxKQojIGRlZ2VuZXJhY3kgY2hlY2s6CmN2ZzEwIDwtIHdoaWNoKHVubGlzdChsYXBwbHkobW9kLnNlbnMuZml0cy4zcHAsICJbWyIsICJjb252ZXJnZW5jZSIpKSA9PSAxMCkKCiMjIyB3LyBsYWcKcGFycy5pLjNwcC5sYWcgPC0gbGFwcGx5KHBhcnMuaS4zcHAsIGZ1bmN0aW9uKHgpIGMoeCwgMTApKSAKbW9kLnNlbnMuZml0cy4zcHAubGFnIDwtIG1vZC5maXRzLmZ4KAogIHBhcnMgPSBwYXJzLmkuM3BwLmxhZywKICBtb2QgPSAiM3BwIiwKICBJbiA9IGluLjEubHMsCiAgc3ViID0gMToyNywKICB1cHBlciA9IGMoMSwgMSwgMSwgMSwgMSwgMTAwKSwKICBsb3dlciA9IGMoMCwgMCwgMCwgMCwgMCwgMCksCiAgY29zdCA9ICIxNEMiLAogIGZpdF9sYWcgPSBUUlVFCikKbmFtZXMobW9kLnNlbnMuZml0cy4zcHAubGFnKSA8LSBuYW1lcyhwYXJzLmkuM3BwLmxhZykKc2F2ZShtb2Quc2Vucy5maXRzLjNwcC5sYWcsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLnNlbnMuZml0cy4zcHAubGFnIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJEYXRhIikpCgojIyBjaGVjayBmb3IgY29udmVyZ2VuY2UKIyBtYXggaXRlcmF0aW9ucyBjaGVjazoKY3ZnMSA8LSB3aGljaCh1bmxpc3QobGFwcGx5KGxhcHBseShtb2Quc2Vucy5maXRzLjNwcC5sYWcsICJbWyIsIDEpLCAiW1siLCAiY29udmVyZ2VuY2UiKSkgPT0gMSkKY3ZnMS5yZWRvIDwtIG1vZC5maXRzLmZ4KAogIHBhcnMgPSBwYXJzLmkuM3BwLmxhZywKICBtb2QgPSAiM3BwIiwKICBJbiA9IGluLjEubHMsCiAgc3ViID0gY3ZnMSwKICB1cHBlciA9IGMoMSwgMSwgMSwgMSwgMSwgMTAwKSwKICBsb3dlciA9IGMoMCwgMCwgMCwgMCwgMCwgMCksCiAgbWF4aXQgPSAxMDAwLAogIGNvc3QgPSAiMTRDIiwKICBmaXRfbGFnID0gVFJVRQopCm5hbWVzKGN2ZzEucmVkbykgPC0gbmFtZXMobW9kLnNlbnMuZml0cy4zcHAubGFnW2N2ZzFdKQojIHJlcGxhY2Ugc2FtcGxlcwptb2Quc2Vucy5maXRzLjNwcC5sYWdbY3ZnMV0gPC0gY3ZnMS5yZWRvCnNhdmUobW9kLnNlbnMuZml0cy4zcHAubGFnLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5zZW5zLmZpdHMuM3BwLmxhZyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SRGF0YSIpKQoKIyBkZWdlbmVyYWN5IGNoZWNrOgpjdmcxMCA8LSB3aGljaCh1bmxpc3QobGFwcGx5KGxhcHBseShtb2Quc2Vucy5maXRzLjNwcC5sYWcsICJbWyIsIDEpLCAiW1siLCAiY29udmVyZ2VuY2UiKSkgPT0gMTApCmN2ZzEwLnJlZG8gPC0gbW9kLmZpdHMuZngoCiAgcGFycyA9IHBhcnMuaS4zcHAubGFnLAogIG1vZCA9ICIzcHAiLAogIEluID0gaW4uMS5scywKICBzdWIgPSBjdmcxMCwKICB1cHBlciA9IGMoMSwgMSwgMSwgMSwgMSwgMTAwKSwKICBsb3dlciA9IGMoMCwgMCwgMCwgMCwgMCAsIDApLAogIG1ldGhvZCA9ICJCRkdTIiwKICBjb3N0ID0gIjE0QyIsCiAgZml0X2xhZyA9IFRSVUUKKQpuYW1lcyhjdmcxMC5yZWRvKSA8LSBuYW1lcyhtb2Quc2Vucy5maXRzLjNwcC5sYWdbY3ZnMTBdKQojIHJlcGxhY2Ugc2FtcGxlcwptb2Quc2Vucy5maXRzLjNwcC5sYWdbY3ZnMTBdIDwtIGN2ZzEwLnJlZG8Kc2F2ZShtb2Quc2Vucy5maXRzLjNwcC5sYWcsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLnNlbnMuZml0cy4zcHAubGFnIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJEYXRhIikpCgoKIyMgc2VyaWVzCm1vZC5zZW5zLmZpdHMuM3BzIDwtIG1vZC5maXRzLmZ4KAogIHBhcnMgPSBwYXJzLmkuM3BzLAogIG1vZCA9ICIzcHMiLAogIEluID0gaW4uMS5scywKICBzdWIgPSAxOjI3LAogIHVwcGVyID0gYygxLCAxLCAxLCAxLCAxKSwKICBsb3dlciA9IGMoMCwgMCwgMCwgMCwgMCksCiAgY29zdCA9ICIxNEMiLAogIGxhZyA9IDAsCiAgZml0X2xhZyA9IEZBTFNFCikKbmFtZXMobW9kLnNlbnMuZml0cy4zcHMpIDwtIG5hbWVzKHBhcnMuaS4zcHMpCnNhdmUobW9kLnNlbnMuZml0cy4zcHMsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLnNlbnMuZml0cy4zcHMiLCAiXyIsIFN5cy5EYXRlKCksICIuUkRhdGEiKSkKCiMjIGNoZWNrIGZvciBjb252ZXJnZW5jZQojIG1heCBpdGVyYXRpb25zIGNoZWNrOgpjdmcxIDwtIHdoaWNoKHVubGlzdChsYXBwbHkobGFwcGx5KG1vZC5zZW5zLmZpdHMuM3BzLCAiW1siLCAxKSwgIltbIiwgImNvbnZlcmdlbmNlIikpID09IDEpCmN2ZzEucmVkbyA8LSBtb2QuZml0cy5meCgKICBwYXJzID0gcGFycy5pLjNwcywKICBtb2QgPSAiM3BzIiwKICBJbiA9IGluLjEubHMsCiAgc3ViID0gY3ZnMSwKICB1cHBlciA9IGMoMSwgMSwgMSwgMSwgMSksCiAgbG93ZXIgPSBjKDAsIDAsIDAsIDAsIDApLAogIG1heGl0ID0gMTAwMCwKICBjb3N0ID0gIjE0QyIsCiAgZml0X2xhZyA9IFRSVUUKKQpuYW1lcyhjdmcxLnJlZG8pIDwtIG5hbWVzKG1vZC5zZW5zLmZpdHMuM3BzW2N2ZzFdKQojIHJlcGxhY2Ugc2FtcGxlcwptb2Quc2Vucy5maXRzLjNwc1tjdmcxXSA8LSBjdmcxLnJlZG8Kc2F2ZShtb2Quc2Vucy5maXRzLjNwcywgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2Quc2Vucy5maXRzLjNwcyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SRGF0YSIpKQoKIyBkZWdlbmVyYWN5IGNoZWNrOgpjdmcxMCA8LSB3aGljaCh1bmxpc3QobGFwcGx5KGxhcHBseShtb2Quc2Vucy5maXRzLjNwcy5sYWcsICJbWyIsIDEpLCAiW1siLCAiY29udmVyZ2VuY2UiKSkgPT0gMTApCmN2ZzEwLnJlZG8gPC0gbW9kLmZpdHMuZngoCiAgcGFycyA9IHBhcnMuaS4zcHMubGFnLAogIG1vZCA9ICIzcHMiLAogIEluID0gaW4uMS5scywKICBzdWIgPSBjdmcxMCwKICB1cHBlciA9IGMoMSwgMSwgMSwgMSwgMSksCiAgbG93ZXIgPSBjKDAsIDAsIDAsIDAsIDApLAogIG1ldGhvZCA9ICJCRkdTIiwKICBjb3N0ID0gIjE0QyIsCiAgZml0X2xhZyA9IFRSVUUKKQpuYW1lcyhjdmcxMC5yZWRvKSA8LSBuYW1lcyhtb2Quc2Vucy5maXRzLjNwcy5sYWdbY3ZnMTBdKQojIHJlcGxhY2Ugc2FtcGxlcwptb2Quc2Vucy5maXRzLjNwcy5sYWdbY3ZnMTBdIDwtIGN2ZzEwLnJlZG8Kc2F2ZShtb2Quc2Vucy5maXRzLjNwcy5sYWcsIGZpbGUgPSBwYXN0ZTAoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy8iLCAibW9kLnNlbnMuZml0cy4zcHMubGFnIiwgIl8iLCBTeXMuRGF0ZSgpLCAiLlJEYXRhIikpCgoKIyMjIHcvIGxhZwpwYXJzLmkuM3BzLmxhZyA8LSBsYXBwbHkocGFycy5pLjNwcywgZnVuY3Rpb24oeCkgYyh4LCAxMCkpICMgc3RhcnQgdy8gMTAgCm1vZC5zZW5zLmZpdHMuM3BzLmxhZyA8LSBtb2QuZml0cy5meCgKICBwYXJzID0gcGFycy5pLjNwcy5sYWcsCiAgbW9kID0gIjNwcyIsCiAgSW4gPSBpbi4xLmxzLAogIHN1YiA9IDE6MjcsCiAgdXBwZXIgPSBjKDEsIDEsIDEsIDEsIDEsIDEwMCksCiAgbG93ZXIgPSBjKDAsIDAsIDAsIDAsIDAsIDApLAogIGNvc3QgPSAiMTRDIiwKICBmaXRfbGFnID0gVFJVRQopCm5hbWVzKG1vZC5zZW5zLmZpdHMuM3BzLmxhZykgPC0gbmFtZXMocGFycy5pLjNwcy5sYWcpCnNhdmUobW9kLnNlbnMuZml0cy4zcHMubGFnLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5zZW5zLmZpdHMuM3BzLmxhZyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SRGF0YSIpKQoKIyMjIyBjaGVjayBmb3IgY29udmVyZ2VuY2UKIyBtYXggaXRlcmF0aW9ucyBjaGVjazoKY3ZnMSA8LSB3aGljaCh1bmxpc3QobGFwcGx5KGxhcHBseShtb2Quc2Vucy5maXRzLjNwcy5sYWcsICJbWyIsIDEpLCAiW1siLCAiY29udmVyZ2VuY2UiKSkgPT0gMSkKY3ZnMS5yZWRvLjNwcy5sYWcgPC0gbW9kLmZpdHMuZngoCiAgcGFycyA9IHBhcnMuaS4zcHMubGFnLAogIG1vZCA9ICIzcHMiLAogIEluID0gaW4uMS5scywKICBzdWIgPSBjdmcxLAogIHVwcGVyID0gYygxLCAxLCAxLCAxLCAxLCAxMDApLAogIGxvd2VyID0gYygwLCAwLCAwLCAwLCAwLCAwKSwKICBtYXhpdCA9IDEwMDAsCiAgY29zdCA9ICIxNEMiLAogIGZpdF9sYWcgPSBUUlVFCikKbmFtZXMoY3ZnMS5yZWRvLjNwcy5sYWcpIDwtIG5hbWVzKG1vZC5zZW5zLmZpdHMuM3BzLmxhZ1tjdmcxXSkKIyByZXBsYWNlIHNhbXBsZXMKbW9kLnNlbnMuZml0cy4zcHMubGFnW2N2ZzFdIDwtIGN2ZzEucmVkby4zcHMubGFnCnNhdmUobW9kLnNlbnMuZml0cy4zcHMubGFnLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5zZW5zLmZpdHMuM3BzLmxhZyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SRGF0YSIpKQojIGRlZ2VuZXJhY3kgY2hlY2s6CmN2ZzEwLjNwcy5sYWcgPC0gd2hpY2godW5saXN0KGxhcHBseShsYXBwbHkobW9kLnNlbnMuZml0cy4zcHMubGFnLCAiW1siLCAxKSwgIltbIiwgImNvbnZlcmdlbmNlIikpID09IDEwKQpgYGAKCmBgYHtyIHBhci1pLWZpdHRlZC1tb2RzLCBldmFsID0gRkFMU0V9Cm1vZC5maXR0ZWQuMnBwLmkgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmkuMnBwKSwgZnVuY3Rpb24oaSkgewogIG1vZEZ1bihwYXJzID0gcGFycy5pLjJwcFtbaV1dLCBJbiA9IGluLjEubHNbW2ldXSwgbW9kID0gIjJwcCIsCiAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgb3V0ID0gInBsb3QuZGYiKQp9KQpuYW1lcyhtb2QuZml0dGVkLjJwcC5pKSA8LSBuYW1lcyhwYXJzLmkuMnBwKQptb2QuZml0dGVkLjJwcy5pIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5pLjJwcyksIGZ1bmN0aW9uKGkpIHsKICBtb2RGdW4ocGFycyA9IHBhcnMuaS4ycHNbW2ldXSwgSW4gPSBpbi4xLmxzW1tpXV0sIG1vZCA9ICIycHMiLAogICAgICAgICB2ZXJib3NlID0gRkFMU0UsIG91dCA9ICJwbG90LmRmIikKfSkKbmFtZXMobW9kLmZpdHRlZC4ycHMuaSkgPC0gbmFtZXMocGFycy5pLjJwcykKYGBgCgpDdXJyZW50bHkgMy1wb29sIGxhZ2dlZCBtb2RlbCBmaXRzIGFyZSBjb21tZW50ZWQgb3V0LiBGaXR0aW5nIDYgcGFyYW1ldGVycyBzZWVtcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoZSBkYXRhc2V0LiBXaGVuIHRoZSBsYWcgaXMgbm90IGZpdCB0aGUgbW9kRml0IG9wdGltaXphdGlvbiBwZXJmb3JtcyBiZXR0ZXIuIFBlcmhhcyBjb3VsZCB1c2UgdGhlIGxhZ3MgZml0IHdpdGggdGhlIDItcG9vbCBtb2RlbCBvcHRpbWl6YXRpb24gZm9yIHRoZSAzLXBvb2wgc3lzdGVtcz8KCmBgYHtyIG1vZEZpdC1zdW1tYXJ5fQojIGxvYWQgZml0cyBhcyBuZWVkZWQKaWYgKCFleGlzdHMoIm1vZC5maXRzLjFwIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2QuZml0cy4xcF8yMDIyLTA4LTExLlJEYXRhIikgCn0KaWYgKCFleGlzdHMoIm1vZC5zZW5zLmZpdHMuMXAubGFnIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2Quc2Vucy5maXRzLjFwLmxhZ18yMDIyLTExLTE4LlJEYXRhIikgCn0KaWYgKCFleGlzdHMoIm1vZC5zZW5zLmZpdHMuMnBwIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2Quc2Vucy5maXRzLjJwcF8yMDIyLTA4LTI0LlJEYXRhIikgCn0KaWYgKCFleGlzdHMoIm1vZC5zZW5zLmZpdHMuMnBwLmxhZyIpKSB7CiBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLnNlbnMuZml0cy4ycHAubGFnXzIwMjItMTEtMTcuUkRhdGEiKSAKfQppZiAoIWV4aXN0cygibW9kLnNlbnMuZml0cy4ycHMiKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5zZW5zLmZpdHMuMnBzXzIwMjItMDgtMjQuUkRhdGEiKSAKfQppZiAoIWV4aXN0cygibW9kLnNlbnMuZml0cy4ycHMubGFnIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9tb2Quc2Vucy5maXRzLjJwcy5sYWdfMjAyMi0xMS0xNi5SRGF0YSIpIAp9CmlmICghZXhpc3RzKCJtb2Quc2Vucy5maXRzLjNwcCIpKSB7CiBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLnNlbnMuZml0cy4zcHBfMjAyMi0xMC0xNy5SRGF0YSIpCn0KaWYgKCFleGlzdHMoIm1vZC5zZW5zLmZpdHMuM3BwLmxhZyIpKSB7CiBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvbW9kLnNlbnMuZml0cy4zcHAubGFnMl8yMDIyLTEwLTE3LlJEYXRhIikKfQppZiAoIWV4aXN0cygibW9kLnNlbnMuZml0cy4zcHMiKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5zZW5zLmZpdHMuM3BzXzIwMjItMTAtMTguUkRhdGEiKQp9CmlmICghZXhpc3RzKCJtb2Quc2Vucy5maXRzLjNwcy5sYWciKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5zZW5zLmZpdHMuM3BzLmxhZ18yMDIyLTEwLTE4LlJEYXRhIikKfQoKIyBnZXQgbW9kIGZpdCBvbmx5CiMjIDFwLCBsYWcKbW9kLmZpdHMuMXAubGFnIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjFwLmxhZywgZnVuY3Rpb24oeCkgeFtbMV1dKQojIyBwcAptb2QuZml0cy4ycHAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwLCBmdW5jdGlvbih4KSB4W1sxXV0pCm1vZC5maXRzLjJwcC5sYWcgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwLmxhZywgZnVuY3Rpb24oeCkgeFtbMV1dKQptb2QuZml0cy4zcHAgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuM3BwLCBmdW5jdGlvbih4KSB4W1sxXV0pCm1vZC5maXRzLjNwcC5sYWcgPC0gbGFwcGx5KG1vZC5zZW5zLmZpdHMuM3BwLmxhZzIsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKIyMgcHMKbW9kLmZpdHMuMnBzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcywgZnVuY3Rpb24oeCkgeFtbMV1dKQptb2QuZml0cy4ycHMubGFnIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjJwcy5sYWcsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKbW9kLmZpdHMuM3BzIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjNwcywgZnVuY3Rpb24oeCkgeFtbMV1dKQptb2QuZml0cy4zcHMubGFnIDwtIGxhcHBseShtb2Quc2Vucy5maXRzLjNwcy5sYWcsIGZ1bmN0aW9uKHgpIHhbWzFdXSkKCiMgZ2V0IHBhcnMKIyMgMXAKcGFycy5maXQuMXAgPC0gbGFwcGx5KG1vZC5maXRzLjFwLCAiW1siLCAxKQpwYXJzLmZpdC4xcC5sYWcgPC0gbGFwcGx5KG1vZC5maXRzLjFwLmxhZywgIltbIiwgMSkKCiMjIDJwCiMjIyBwcApwYXJzLmZpdC4ycHAgPC0gbGFwcGx5KG1vZC5maXRzLjJwcCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKQpwYXJzLmZpdC4ycHAubGFnIDwtIGxhcHBseShtb2QuZml0cy4ycHAubGFnLCAiW1siLCAxKSAKbmFtZXMocGFycy5maXQuMnBwLmxhZykgPC0gbmFtZXMobW9kLmZpdHMuMnBwLmxhZykKCiMjIyBwcwpwYXJzLmZpdC4ycHMgPC0gbGFwcGx5KG1vZC5maXRzLjJwcywgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKQpwYXJzLmZpdC4ycHMubGFnIDwtIGxhcHBseShtb2QuZml0cy4ycHMubGFnLCAiW1siLCAxKSAKbmFtZXMocGFycy5maXQuMnBzLmxhZykgPC0gbmFtZXMobW9kLmZpdHMuMnBzLmxhZykKCgojIyAzcAojIyMgcHAKcGFycy5maXQuM3BwIDwtIGxhcHBseShtb2QuZml0cy4zcHAsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjNwcCkgPC0gbmFtZXMobW9kLmZpdHMuM3BwKQpwYXJzLmZpdC4zcHAubGFnIDwtIGxhcHBseShtb2QuZml0cy4zcHAubGFnLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4zcHAubGFnKSA8LSBuYW1lcyhtb2QuZml0cy4zcHAubGFnKQoKIyMjIHBzCnBhcnMuZml0LjNwcyA8LSBsYXBwbHkobW9kLmZpdHMuM3BzLCAiW1siLCAxKQpuYW1lcyhwYXJzLmZpdC4zcHMpIDwtIG5hbWVzKHBhcnMuaS4zcHMpCnBhcnMuZml0LjNwcy5sYWcgPC0gbGFwcGx5KG1vZC5maXRzLjNwcy5sYWcsICJbWyIsIDEpCm5hbWVzKHBhcnMuZml0LjNwcy5sYWcpIDwtIG5hbWVzKG1vZC5maXRzLjNwcy5sYWcpCgoKIyBydW4gZml0dGVkIG1vZGVscwojIyAxcAptb2QuZml0dGVkLjFwIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMXApLCBmdW5jdGlvbihpKSB7CiAgbW9kRnVuKHBhcnMgPSBwYXJzLmZpdC4xcFtbaV1dLCBJbiA9IGluLjEubHNbW2ldXSwgbW9kID0gIjFwIiwgdmVyYm9zZSA9IEZBTFNFLCBvdXQgPSAicGxvdC5kZiIpCn0pCm5hbWVzKG1vZC5maXR0ZWQuMXApIDwtIG5hbWVzKHBhcnMuZml0LjFwKQptb2QuZml0dGVkLjFwLmxhZyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjFwKSwgZnVuY3Rpb24oaSkgewogIG1vZEZ1bihwYXJzID0gcGFycy5maXQuMXAubGFnW1tpXV0sIEluID0gaW4uMS5sc1tbaV1dLCBtb2QgPSAiMXAiLCB2ZXJib3NlID0gRkFMU0UsIG91dCA9ICJwbG90LmRmIiwgZml0X2xhZyA9IFRSVUUpCn0pCm5hbWVzKG1vZC5maXR0ZWQuMXAubGFnKSA8LSBuYW1lcyhwYXJzLmZpdC4xcCkKCiMjIDJwCiMjIyAycHAKbW9kLmZpdHRlZC4ycHAgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHApLCBmdW5jdGlvbihpKSB7CiAgbW9kRnVuKHBhcnMgPSBwYXJzLmZpdC4ycHBbW2ldXSwgSW4gPSBpbi4xLmxzW1tpXV0sIG1vZCA9ICIycHAiLCAKICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLCBvdXQgPSAicGxvdC5kZiIpCn0pCm5hbWVzKG1vZC5maXR0ZWQuMnBwKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHApCm1vZC5maXR0ZWQuMnBwLmxhZyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcC5sYWcpLCBmdW5jdGlvbihpKSB7CiAgbW9kRnVuKHBhcnMgPSBwYXJzLmZpdC4ycHAubGFnW1tpXV0sIEluID0gaW4uMS5sc1tbaV1dLCBtb2QgPSAiMnBwIiwgCiAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgb3V0ID0gInBsb3QuZGYiLCBmaXRfbGFnID0gVFJVRSkKfSkKbmFtZXMobW9kLmZpdHRlZC4ycHAubGFnKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHAubGFnKQoKIyMgMnBzCm1vZC5maXR0ZWQuMnBzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBzKSwgZnVuY3Rpb24oaSkgewogIG1vZEZ1bihwYXJzID0gcGFycy5maXQuMnBzW1tpXV0sIEluID0gaW4uMS5sc1tbaV1dLCBtb2QgPSAiMnBzIiwgCiAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgb3V0ID0gInBsb3QuZGYiKQp9KQpuYW1lcyhtb2QuZml0dGVkLjJwcykgPC0gbmFtZXMocGFycy5maXQuMnBzKQptb2QuZml0dGVkLjJwcy5sYWcgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMubGFnKSwgZnVuY3Rpb24oaSkgewogIG1vZEZ1bihwYXJzID0gcGFycy5maXQuMnBzLmxhZ1tbaV1dLCBJbiA9IGluLjEubHNbW2ldXSwgbW9kID0gIjJwcyIsIAogICAgICAgICB2ZXJib3NlID0gRkFMU0UsIG91dCA9ICJwbG90LmRmIiwgZml0X2xhZyA9IFRSVUUpCn0pCm5hbWVzKG1vZC5maXR0ZWQuMnBzLmxhZykgPC0gbmFtZXMocGFycy5maXQuMnBzLmxhZykKCiMjIDNwCiMjIyAzcHAKbW9kLmZpdHRlZC4zcHAgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4zcHApLCBmdW5jdGlvbihpKSB7CiAgbW9kRnVuKHBhcnMgPSBwYXJzLmZpdC4zcHBbW2ldXSwgSW4gPSBpbi4xLmxzW1tpXV0sIG1vZCA9ICIzcHAiLCAKICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLCBvdXQgPSAicGxvdC5kZiIpCn0pCm5hbWVzKG1vZC5maXR0ZWQuM3BwKSA8LSBuYW1lcyhwYXJzLmZpdC4zcHApCm1vZC5maXR0ZWQuM3BwLmxhZyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjNwcC5sYWcpLCBmdW5jdGlvbihpKSB7CiAgbW9kRnVuKHBhcnMgPSBwYXJzLmZpdC4zcHAubGFnW1tpXV0sIEluID0gaW4uMS5sc1tbaV1dLCBtb2QgPSAiM3BwIiwKICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLCBvdXQgPSAicGxvdC5kZiIsIGZpdF9sYWcgPSBUUlVFKQp9KQpuYW1lcyhtb2QuZml0dGVkLjNwcC5sYWcpIDwtIG5hbWVzKHBhcnMuZml0LjNwcC5sYWcpCgojIyMgM3BzCm1vZC5maXR0ZWQuM3BzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuM3BzKSwgZnVuY3Rpb24oaSkgewogIG1vZEZ1bihwYXJzID0gcGFycy5maXQuM3BzW1tpXV0sIEluID0gaW4uMS5sc1tbaV1dLCBtb2QgPSAiM3BzIiwgCiAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgb3V0ID0gInBsb3QuZGYiKQp9KQpuYW1lcyhtb2QuZml0dGVkLjNwcykgPC0gbmFtZXMocGFycy5maXQuM3BzKQptb2QuZml0dGVkLjNwcy5sYWcgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4zcHMubGFnKSwgZnVuY3Rpb24oaSkgewogIG1vZEZ1bihwYXJzID0gcGFycy5maXQuM3BzLmxhZ1tbaV1dLCBJbiA9IGluLjEubHNbW2ldXSwgbW9kID0gIjNwcyIsCiAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgb3V0ID0gInBsb3QuZGYiLCBmaXRfbGFnID0gVFJVRSkKfSkKbmFtZXMobW9kLmZpdHRlZC4zcHMubGFnKSA8LSBuYW1lcyhwYXJzLmZpdC4zcHMubGFnKQoKCiMgZ2V0IHNzcgpnZXQuc3NyLmZ4IDwtIGZ1bmN0aW9uKG1vZC5maXQubHMsIG1vZCkgewogIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0LmxzLCAiWyIsICJzc3IiKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpICU+JQogIG11dGF0ZShtb2QgPSBtb2QsCiAgICAgICAgIGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KFBNZWNvX2RlcHRoLCAiXyIpLCAiW1siLCAyKSkKfQoKIyMgMXAKc3NyLjFwLmRmIDwtIGdldC5zc3IuZngobW9kLmZpdHMuMXAsICIxcCIpCnNzci4xcC5sYWcuZGYgPC0gZ2V0LnNzci5meChtb2QuZml0cy4xcC5sYWcsICIxcCwgbGFnIikKCiMjIDJwCnNzci4ycHAuZGYgPC0gZ2V0LnNzci5meChtb2QuZml0cy4ycHAsICIycHAiKQpzc3IuMnBwLmxhZy5kZiA8LSBnZXQuc3NyLmZ4KG1vZC5maXRzLjJwcC5sYWcsICIycHAsIGxhZyIpCnNzci4ycHMuZGYgPC0gZ2V0LnNzci5meChtb2QuZml0cy4ycHMsICIycHMiKQpzc3IuMnBzLmxhZy5kZiA8LSBnZXQuc3NyLmZ4KG1vZC5maXRzLjJwcy5sYWcsICIycHMsIGxhZyIpCgojIyAzcApzc3IuM3BwLmRmIDwtIGdldC5zc3IuZngobW9kLmZpdHMuM3BwLCAiM3BwIikKc3NyLjNwcC5sYWcuZGYgPC0gZ2V0LnNzci5meChtb2QuZml0cy4zcHAubGFnLCAiM3BwLCBsYWciKQpzc3IuM3BzLmRmIDwtIGdldC5zc3IuZngobW9kLmZpdHMuM3BzLCAiM3BzIikKc3NyLjNwcy5sYWcuZGYgPC0gZ2V0LnNzci5meChtb2QuZml0cy4zcHMubGFnLCAiM3BzLCBsYWciKQoKIyBzdW1tYXJpemUgcGFycwojIyAxcApwYXJzLmZpdC4xcC5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjFwLCBmdW5jdGlvbih4KSB7CiAgIyMgaW5zcGlyZWQgYnkgc3VtbWFyeS5tb2RGaXQgKEZNRSkKICBzdW1tYXJ5LjFwLm1vZEZpdCA8LSBmdW5jdGlvbiAob2JqZWN0LCBjb3YgPSBGQUxTRSwuLi4pIHsKICAgIHBhcmFtICA8LSBvYmplY3QkcGFyCiAgICBwbmFtZXMgPC0gbmFtZXMocGFyYW0pCiAgICBwICAgICAgPC0gbGVuZ3RoKHBhcmFtKQogICAgY292YXIgIDwtIHRyeShzb2x2ZSgwLjUqb2JqZWN0JGhlc3NpYW4pLCBzaWxlbnQgPSBUUlVFKSAgICMgdW5zY2FsZWQgY292YXJpYW5jZQogICAgaWYgKCFpcy5udW1lcmljKGNvdmFyKSkgewogICAgICBtZXNzYWdlIDwtICJDYW5ub3QgZXN0aW1hdGUgY292YXJpYW5jZTsgc3lzdGVtIGlzIHNpbmd1bGFyIgogICAgICB3YXJuaW5nKG1lc3NhZ2UpCiAgICAgIGNvdmFyIDwtIG1hdHJpeChkYXRhID0gTkEsIG5yb3cgPSBwLCBuY29sID0gcCkKICAgIH0gZWxzZSBtZXNzYWdlIDwtICJvayIKICAKICAgIHJvd25hbWVzKGNvdmFyKSA8LSBjb2xuYW1lcyhjb3ZhcikgPC1wbmFtZXMKICAgIHJkZiAgICA8LSBvYmplY3QkZGYucmVzaWR1YWwKICAgIHJlc3ZhciA8LSBvYmplY3Qkc3NyIC8gcmRmCiAgICBzZSAgICAgPC0gc3FydChkaWFnKGNvdmFyKSAqIHJlc3ZhcikKICAgIG5hbWVzKHNlKSA8LSBwbmFtZXMKICAgIHR2YWwgICAgICA8LSBwYXJhbSAvIHNlCiAgICBtb2RWYXJpYW5jZSA8LSBvYmplY3Qkc3NyIC8gbGVuZ3RoKG9iamVjdCRyZXNpZHVhbHMpCiAgCiAgICBwYXJhbSA8LSBjYmluZChwYXJhbSwgc2UsIHR2YWwsIDIgKiBwdChhYnModHZhbCksIHJkZiwgbG93ZXIudGFpbCA9IEZBTFNFKSkKICAgIGRpbW5hbWVzKHBhcmFtKSA8LSBsaXN0KHBuYW1lcywgYygiRXN0aW1hdGUiLCAiU3RkLiBFcnJvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInQgdmFsdWUiLCAiUHIoPnx0fCkiKSkKICAgIGlmIChjb3YpCiAgICAgIGFucyA8LSBsaXN0KHJlc2lkdWFscyA9IG9iamVjdCRyZXNpZHVhbHMsCiAgICAgICAgICAgICAgICAgIHJlc2lkdWFsVmFyaWFuY2UgPSByZXN2YXIsCiAgICAgICAgICAgICAgICAgIHNpZ21hID0gc3FydChyZXN2YXIpLAogICAgICAgICAgICAgICAgICBtb2RWYXJpYW5jZSA9IG1vZFZhcmlhbmNlLAogICAgICAgICAgICAgICAgICBkZiA9IGMocCwgcmRmKSwgY292LnVuc2NhbGVkID0gY292YXIsCiAgICAgICAgICAgICAgICAgIGNvdi5zY2FsZWQgPSBjb3ZhciAqIHJlc3ZhciwKICAgICAgICAgICAgICAgICAgcGFyID0gcGFyYW0pCiAgICBlbHNlCiAgICAgIGFucyA8LSBsaXN0KHJlc2lkdWFscyA9IG9iamVjdCRyZXNpZHVhbHMsCiAgICAgICAgICAgICAgICAgIHJlc2lkdWFsVmFyaWFuY2UgPSByZXN2YXIsCiAgICAgICAgICAgICAgICAgIHNpZ21hID0gc3FydChyZXN2YXIpLAogICAgICAgICAgICAgICAgICBtb2RWYXJpYW5jZSA9IG1vZFZhcmlhbmNlLAogICAgICAgICAgICAgICAgICBkZiA9IGMocCwgcmRmKSwKICAgICAgICAgICAgICAgICAgaW5mbyA9IG9iamVjdCRpbmZvLCBuaXRlciA9IG9iamVjdCRpdGVyYXRpb25zLAogICAgICAgICAgICAgICAgICBzdG9wbWVzcyA9IG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgIHBhciA9IHBhcmFtKQogICAgY2xhc3MoYW5zKSA8LSAic3VtbWFyeS5tb2RGaXQiCiAgICBhbnMKICB9CiAgc3VtbWFyeS4xcC5tb2RGaXQoeCkKfSkKCiMjIDFwLCBsYWcKcGFycy5maXQuMXAubGFnLnN1bSA8LSBsYXBwbHkobW9kLmZpdHMuMXAubGFnLCBmdW5jdGlvbih4KSB7CiAgdHJ5Q2F0Y2goc3VtbWFyeSh4KSwgCiAgICAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMocGFycy5maXQuMXAubGFnLnN1bSkgPC0gbmFtZXMocGFycy5maXQuMXAubGFnKQoKIyMgMnAKIyMjIHBwCnBhcnMuZml0LjJwcC5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjJwcCwgZnVuY3Rpb24oeCkgewogIHRyeUNhdGNoKHN1bW1hcnkoeCksIAogICAgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKHBhcnMuZml0LjJwcC5zdW0pIDwtIG5hbWVzKHBhcnMuZml0LjJwcCkKIyByZXBsYWNlIHNpdGVzIHRoYXQgZXJyb3Igdy8gTlVMTCAoZm9yIG1vZE1DTUMgZngpCnBhcnMuZml0LjJwcC5zdW1bWzIxXV0gPC0gTlVMTApwYXJzLmZpdC4ycHAuc3VtW1syMl1dIDwtIE5VTEwKIyB3LyBsYWcKcGFycy5maXQuMnBwLmxhZy5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjJwcC5sYWcsIGZ1bmN0aW9uKHgpIHsKICB0cnlDYXRjaChzdW1tYXJ5KHgpLCAKICAgICAgICAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhwYXJzLmZpdC4ycHAubGFnLnN1bSkgPC0gbmFtZXMocGFycy5maXQuMnBwLmxhZykKcGFycy5maXQuMnBwLmxhZy5zdW1bWzI0XV0gPC0gTlVMTAoKIyMjIHBzCnBhcnMuZml0LjJwcy5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjJwcywgZnVuY3Rpb24oeCkgewogIHRyeUNhdGNoKHN1bW1hcnkoeCksIAogICAgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKHBhcnMuZml0LjJwcy5zdW0pIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKIyB3LyBsYWcKcGFycy5maXQuMnBzLmxhZy5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjJwcy5sYWcsIGZ1bmN0aW9uKHgpIHsKICB0cnlDYXRjaChzdW1tYXJ5KHgpLCAKICAgICAgICAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhwYXJzLmZpdC4ycHMubGFnLnN1bSkgPC0gbmFtZXMocGFycy5maXQuMnBzLmxhZykKCiMjIDNwCiMjIyBwcApwYXJzLmZpdC4zcHAuc3VtIDwtIGxhcHBseShtb2QuZml0cy4zcHAsIGZ1bmN0aW9uKHgpIHsKICB0cnlDYXRjaChzdW1tYXJ5KHgpLAogICAgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKHBhcnMuZml0LjNwcC5zdW0pIDwtIG5hbWVzKHBhcnMuZml0LjNwcCkKIyBOZWVkIHRvIHJlcGxhY2UgNSBlbnRyaWVzIHcvIE5VTEwgKGZvciBtb2RNQ01DIGZ4KQoKcGFycy5maXQuM3BwLmxhZy5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjNwcC5sYWcsIGZ1bmN0aW9uKHgpIHsKICB0cnlDYXRjaChzdW1tYXJ5KHgpLAogICAgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKHBhcnMuZml0LjNwcC5sYWcuc3VtKSA8LSBuYW1lcyhwYXJzLmZpdC4zcHAubGFnKQoKIyMjIHBzCnBhcnMuZml0LjNwcy5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjNwcywgZnVuY3Rpb24oeCkgewogIHRyeUNhdGNoKHN1bW1hcnkoeCksCiAgICAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMocGFycy5maXQuM3BzLnN1bSkgPC0gbmFtZXMocGFycy5maXQuM3BzKQojIE5lZWQgdG8gcmVwbGFjZSAyIGVudHJpZXMgdy8gTlVMTCAoZm9yIG1vZE1DTUMgZngpCgpwYXJzLmZpdC4zcHMubGFnLnN1bSA8LSBsYXBwbHkobW9kLmZpdHMuM3BzLmxhZywgZnVuY3Rpb24oeCkgewogIHRyeUNhdGNoKHN1bW1hcnkoeCksCiAgICAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKfSkKbmFtZXMocGFycy5maXQuM3BzLmxhZy5zdW0pIDwtIG5hbWVzKHBhcnMuZml0LjNwcy5sYWcpCmBgYAoKYGBge3IgY29tcGFyZS1wYXJzfQojIGNvbXBhcmUgcGFyIGZpdHMKcGFyLmZpdC5kZi5meCA8LSBmdW5jdGlvbihwYXJzX2ZpdCwgcGFyc19maXRfYWx0LCBwYXJfc2V0X25tcykgewogIAogICMgY2hlY2sgbGFnCiAgaWYgKGxlbmd0aChwYXJzX2ZpdFtbMV1dKSA9PSA0KSB7CiAgICBwYXJzX2ZpdCA8LSBsYXBwbHkocGFyc19maXQsICJbIiwgMTozKQogIH0gCiAgaWYgKGxlbmd0aChwYXJzX2ZpdF9hbHRbWzFdXSkgPT0gNCkgewogICAgcGFyc19maXRfYWx0IDwtIGxhcHBseShwYXJzX2ZpdF9hbHQsICJbIiwgMTozKQogIH0gCiAgCiAgZGYgPC0gYmluZF9yb3dzKAogICAgbGFwcGx5KAogICAgICBtYXBwbHkocmJpbmQsIAogICAgICAgICAgICAgcGFyc19maXQsCiAgICAgICAgICAgICBwYXJzX2ZpdF9hbHQsCiAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKSwgCiAgICAgIGZ1bmN0aW9uKGRmKSB7CiAgICAgICAgZGYgPC0gZGF0YS5mcmFtZShkZikKICAgICAgICBjb2xuYW1lcyhkZikgPC0gYygia2YiLCAia3MiLCAicGFyMyIpCiAgICAgICAgZGYkZXN0IDwtIHBhcl9zZXRfbm1zCiAgICAgICAgcmV0dXJuKGRmKQogICAgICB9KQogICkKICBkZiRQTWVjb19kZXB0aCA8LSByZXAobmFtZXMocGFyc19maXQpLCBlYWNoID0gMikKICBkZiRQTSA8LSBzdWJzdHIoZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpCiAgZGYkZWNvIDwtIHN1YnN0cihkZiRQTWVjb19kZXB0aCwgc3RhcnQgPSAzLCBzdG9wID0gNCkKICBkZiRkZXB0aCA8LSBzdWJzdHIoZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gNiwgc3RvcCA9IGxlbmd0aChkZiRQTWVjb19kZXB0aCkpCiAgcmV0dXJuKGRmKQp9CgojIHJ1biBmeCBmb3IgMnAgbW9kcwpwYXJzLmZpdC4ycHAuMnBzLmRmIDwtIHBhci5maXQuZGYuZngocGFyc19maXQgPSBwYXJzLmZpdC4ycHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzX2ZpdF9hbHQgPSBwYXJzLmZpdC4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJfc2V0X25tcyA9IGMoIjJwcCIsICIycHMiKSkgCnBhcnMuZml0LjJwcC5sYWcuZGYgPC0gcGFyLmZpdC5kZi5meChwYXJzX2ZpdCA9IHBhcnMuZml0LjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNfZml0X2FsdCA9IHBhcnMuZml0LjJwcC5sYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJfc2V0X25tcyA9IGMoIjJwcCIsICIycHAubGFnIikpIApwYXJzLmZpdC4ycHMubGFnLmRmIDwtIHBhci5maXQuZGYuZngocGFyc19maXQgPSBwYXJzLmZpdC4ycHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzX2ZpdF9hbHQgPSBwYXJzLmZpdC4ycHMubGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyX3NldF9ubXMgPSBjKCIycHMiLCAiMnBzLmxhZyIpKSAKCiMgc3VtbWFyaXplIGFjcm9zcyBQTSwgRUNPIHZhcnMKcGFycy5maXQuMnBwLjJwcy5QTXN1bS5kZiA8LSBwYXJzLmZpdC4ycHAuMnBzLmRmICU+JQogICAgZ3JvdXBfYnkoUE0sIGVzdCkgJT4lCiAgICBzdW1tYXJpemUoYWNyb3NzKC5jb2xzID0gYyhrZiwga3MsIHBhcjMpLCAuZm5zID0gbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIGRpZ2l0cyA9IDIpCnBhcnMuZml0LjJwcC4ycHMuRUNPc3VtLmRmIDwtIHBhcnMuZml0LjJwcC4ycHMuZGYgJT4lCiAgICBncm91cF9ieShlY28sIGVzdCkgJT4lCiAgICBzdW1tYXJpemUoYWNyb3NzKC5jb2xzID0gYyhrZiwga3MsIHBhcjMpLCAuZm5zID0gbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIGRpZ2l0cyA9IDIpCmBgYAoKYGBge3IgbW9kLWZpdC1wbG90LWZ4c30Kc2luZ2xlTW9kLmZpdC5wbG90LmZ4IDwtIGZ1bmN0aW9uKG1vZEZpdC5scywgbW9kLCBzZW5zcmFuZ2UgPSBGQUxTRSwgLi4uKSB7CiAgbGFwcGx5KHNlcV9hbG9uZyhtb2RGaXQubHMpLCBmdW5jdGlvbihpKSB7CiAgICBQTWVjb19kZXB0aCA8LSBuYW1lcyhtb2RGaXQubHMpW2ldCiAgICBjb24uZGYgPC0gY29uLmRmLmZ4KFBNZWNvX2RlcHRoKQogICAgcCA8LSBDMTQucGxvdC5meChtb2RGaXQubHNbW2ldXSwgY29uLmRmLCBtb2QsIFBNZWNvX2RlcHRoID0gUE1lY29fZGVwdGgpCiAgICBpZiAoc2Vuc3JhbmdlKSB7CiAgICAgIHAgKyAKICAgICAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHE5NSwgeW1heCA9IHEwNSwgZmlsbCA9IHBvb2wpLCBhbHBoYSA9IC4zKSArCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICAgICAgICBuYW1lID0gIk1vZGVsIHBvb2wiLAogICAgICAgICAgdmFsdWVzID0gYygiYnVsa0MiID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjZTQ3YjFmIikpCiAgICB9IGVsc2UgewogICAgICBwCiAgICB9CiAgfSkKfQoKbXVsdGlNb2QuZml0LnBsb3QuZnggPC0gZnVuY3Rpb24oZml0MSwgZml0MS5uYW1lLCBmaXQyLCBmaXQyLm5hbWUsIGZpdDMgPSBOVUxMLCBmaXQzLm5hbWUgPSBOVUxMLCBzZW5zcmFuZ2UgPSBGQUxTRSwgYXZhbHNfc3IgPSBOVUxMKSB7CiAgCiAgbGFwcGx5KHNlcV9hbG9uZyhmaXQxKSwgZnVuY3Rpb24oaSkgewogICAgUE1lY29fZGVwdGggPC0gbmFtZXMoZml0MSlbaV0KICAgIGNvbi5kZiA8LSBjb24uZGYuZngoUE1lY29fZGVwdGgpCiAgICBwbG90LmRmIDwtIHJiaW5kKGZpdDFbW2ldXSwKICAgICAgICAgICAgICAgICAgICAgZml0MltbaV1dLAogICAgICAgICAgICAgICAgICAgICBmaXQzW1tpXV0pCiAgICBwbG90LmRmJE1vZGVsIDwtIGZhY3RvcihjKHJlcChmaXQxLm5hbWUsIG5yb3coZml0MVtbaV1dKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcChmaXQyLm5hbWUsIG5yb3coZml0MltbaV1dKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcChmaXQzLm5hbWUsIG5yb3coZml0M1tbaV1dKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhmaXQxLm5hbWUsIGZpdDIubmFtZSwgZml0My5uYW1lKSkKICAgIAogICAgcCA8LSBwbG90LmRmICU+JQogICAgICBmaWx0ZXIocG9vbCA9PSAiYnVsa0MiIHwgcG9vbCA9PSAicmVzcGlyYXRpb24iIHwgcG9vbCA9PSAiYXRtIikgJT4lCiAgICAgIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMpKSArCiAgICAgIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBNb2RlbCwgY29sb3IgPSBwb29sKSkgKwogICAgICBnZW9tX3BvaW50KGRhdGEgPSBjb24uZGYsIGFlcyhZZWFyLCBkMTRjLCBjb2xvciA9IHBvb2wpLCBzaXplID0gMykgKwogICAgICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgICAgICB2YWx1ZXMgPSBjKCJhdG0iID0gOCwKICAgICAgICAgICAgICAgICAgICJidWxrQyIgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjZTQ3YjFmIikpICsKICAgICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICAgICAgZ2d0aXRsZShQTWVjb19kZXB0aCkgKwogICAgICB4bGFiKCJZZWFyIikgKwogICAgICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgICB0aGVtZV9idygpICsKICAgICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKICAgIAogICAgaWYgKHNlbnNyYW5nZSkgewogICAgICBpZiAoaXMubnVsbChhdmFsc19zcikpIHN0b3AoImFscGhhIHZhbHVlcyBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHNlbnNyYW5nZSA9IFRSVUUiKQogICAgICBwICsgCiAgICAgICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBxOTUsIHltYXggPSBxMDUsIGZpbGwgPSBwb29sLCBhbHBoYSA9IE1vZGVsKSkgKwogICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgICAgICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgICAgICAgIHZhbHVlcyA9IGMoImJ1bGtDIiA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI2U0N2IxZiIpKSArCiAgICAgICAgc2NhbGVfYWxwaGFfbWFudWFsKAogICAgICAgICAgbmFtZSA9ICJNb2RlbCIsCiAgICAgICAgICB2YWx1ZXMgPSBhdmFsc19zcikKICAgIH0gZWxzZSB7CiAgICAgIHAKICAgIH0KICB9KQp9CmBgYAoKIyMgbW9kRml0IHRpbWVzZXJpZXMKCmBgYHtyIHBsb3QtbW9kRml0LWN1cnZlcywgZXZhbCA9IEZBTFNFfQojIGFsbCAxcCBtb2RzCnBsb3QubHMuMXAgPC0gc2luZ2xlTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuMXAsICIxcCIpCgojIGFsbCAycHAgbW9kcwpwbG90LmxzLjJwcCA8LSBzaW5nbGVNb2QuZml0LnBsb3QuZngobW9kLmZpdHRlZC4ycHAsICIycHAiKQojIHcvIGxhZwpwbG90LmxzLjJwcC5sYWcgPC0gc2luZ2xlTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuMnBwLmxhZywgIjJwcCwgbGFnZ2VkIikKIyBsYWdnZWQgdnMuIHVubGFnZ2VkCnBsb3QubHMuMnBwLjJwcC5sYWcgPC0gbXVsdGlNb2QuZml0LnBsb3QuZngobW9kLmZpdHRlZC4ycHAsICIycHAiLCBtb2QuZml0dGVkLjJwcC5sYWcsICIycHAsIGxhZyIpCgojIGFsbCAycHMgbW9kcwpwbG90LmxzLjJwcyA8LSBzaW5nbGVNb2QuZml0LnBsb3QuZngobW9kLmZpdHRlZC4ycHMsICIycHMiKQojIHcvIGxhZwpwbG90LmxzLjJwcy5sYWcgPC0gc2luZ2xlTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuMnBzLmxhZywgIjJwcywgbGFnZ2VkIikKIyBsYWdnZWQgdnMuIHVubGFnZ2VkCnBsb3QubHMuMnBzLjJwcy5sYWcgPC0gbXVsdGlNb2QuZml0LnBsb3QuZngobW9kLmZpdHRlZC4ycHMsICIycHMiLCBtb2QuZml0dGVkLjJwcy5sYWcsICIycHMsIGxhZyIpCgojIHBsb3QgMnBwLCBsYWcgYWdhaW5zdCAycHMsIGxhZwpwbG90LmxzLjJwcC4ycHMubGFnIDwtIG11bHRpTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuMnBwLmxhZywgIjJwcCwgbGFnIiwgbW9kLmZpdHRlZC4ycHMubGFnLCAiMnBzLCBsYWciKQoKIyBwbG90IGluaXRpYWwgdnMuIG9wdGltaXplZCBmaXQKbXVsdGlNb2QuZml0LnBsb3QuZngoCiAgbW9kLmZpdHRlZC4ycHBbaXguMTBdLCAiMnBwLCBmaXR0ZWQiLAogIGxhcHBseShwYXJzLmkuMnBwW2l4LjEwXSwgZnVuY3Rpb24oeCkKICAgIG1vZEZ1bih4LCAiMnBwIiwgMSwgb3V0ID0gIiIsIHZlcmJvc2UgPSBGQUxTRSkpLCAiMnBwLCBpbml0aWFsIikKCm11bHRpTW9kLmZpdC5wbG90LmZ4KAogIG1vZC5maXR0ZWQuMnBzW2l4LjEwXSwgIjJwcywgZml0dGVkIiwKICBsYXBwbHkocGFycy5pLjJwc1tpeC4xMF0sIGZ1bmN0aW9uKHgpCiAgICBtb2RGdW4oeCwgIjJwcyIsIDEsIG91dCA9ICIiLCB2ZXJib3NlID0gRkFMU0UpKSwgIjJwcywgaW5pdGlhbCIpCgojIGNoZWNrIGxhZyBlZmZlY3RzCm11bHRpTW9kLmZpdC5wbG90LmZ4KAogIG1vZC5maXR0ZWQuMnBwW2l4LjEwXSwgIjJwcCwgZml0dGVkIiwKICBtb2QuZml0dGVkLjJwcC5sYWcsICIycHAsIGxhZyIpCnBsb3QubHMuMnBwLjJwcy5sYWcKCiMgcGxvdCAycHAsIGxhZyBhZ2FpbnN0IDNwcCwgbGFnCiMgbXVsdGlNb2QuZml0LnBsb3QuZngobW9kLmZpdHRlZC4ycHAubGFnLCAiMnBwLCBsYWciLCBtb2QuZml0dGVkLjNwcC5sYWcyLCAiM3BwLCBsYWciKQojIG11bHRpTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuM3BwLmxhZywgIjNwcCIsIG1vZC5maXR0ZWQuM3BwLmxhZzIsICIzcHAsIGxhZyIpCgojIDNwcCB2cy4gM3BzCm11bHRpTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuM3BwLCAiM3BwIiwgbW9kLmZpdHRlZC4zcHMsICIzcHMiKQoKIyAzcHMgdnMuIDJwcwptdWx0aU1vZC5maXQucGxvdC5meChtb2QuZml0dGVkLjJwcywgIjJwcyIsIG1vZC5maXR0ZWQuM3BzLCAiM3BzIikKYGBgCgojIyBtb2RGaXQgU1NSCgpgYGB7ciBtb2RGaXQtZXJyLWNvbXB9CiMjIGNvbXBhcmUgdW5jZXJ0YWludHkgYW5kIGdvb2RuZXNzIG9mIGZpdCBmb3IgbW9kRml0IGVzdGltYXRlcwojIGNvbWJpbmUgc3NyICYgcGxvdApzc3IuZGYgPC0gcmJpbmQoCiAgc3NyLjFwLmRmLAogIHNzci4xcC5sYWcuZGYsCiAgc3NyLjJwcC5kZiwKICBzc3IuMnBzLmRmLAogIHNzci4ycHAubGFnLmRmLAogIHNzci4ycHMubGFnLmRmLAogIHNzci4zcHAuZGYsCiAgc3NyLjNwcy5kZikgJT4lIAogIG11dGF0ZShQTWVjbyA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgNCkpCgojIE5COiBTU1IgZm9yIDFwIG1vZGVscyBpcyBvZmYgdGhlIGNoYXJ0cwpzc3IucGxvdC5tb2RGaXQgPC0gc3NyLmRmICU+JQogIGZpbHRlcihtb2QgIT0gIjFwIikgJT4lCiAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJHUnJmXzEwLTIwIiAmIFBNZWNvX2RlcHRoICE9ICJHUnJmXzIwLTMwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhQTWVjbywgc3NyLCBmaWxsID0gbW9kKSkgKyAKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICBuYW1lID0gIk1vZGVsIiwKICAgIHZhbHVlcyA9IGMoIjFwLCBsYWciID0gImdyYXkiLAogICAgICAgICAgICAgICAiMnBwIiA9ICIjMDBhNmFiIiwKICAgICAgICAgICAgICAgIjJwcCwgbGFnIiA9ICIjMDBkOGRlIiwKICAgICAgICAgICAgICAgIjJwcyIgPSAiI2JjNjNmZiIsCiAgICAgICAgICAgICAgICIycHMsIGxhZyIgPSAiI2QyOTdmZiIsCiAgICAgICAgICAgICAgICIzcHAiID0gIiNlMmQ2MDAiLAogICAgICAgICAgICAgICAiM3BzIiA9ICIjZDYwMGUyIikpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgc2xpZ2h0bHkgaGlnaGVyIFNTUiBmb3Igbm9uLWxhZ2dlZCBtb2RlbHMKIyBPdGhlcndpc2UgYWxsIG1vZGVsIHN0cnVjdHVyZXMgPiAxcCBhcmUgcmVsYXRpdmVseSBlcXVhbCAoMnAgdnMgM3AsIHBzIHZzIHBwKQoKIyBtZWFuIHJlc2lkdWFscywgYnkgdmFyICh2YXJfbXMpCnZhcl9tcy5kZi5meCA8LSBmdW5jdGlvbihtb2QuZml0cy5scywgY29zdHMsIG1vZCkgewogIGRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy5scywgIlsiLCAidmFyX21zIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQogIGRmJHZhciA8LSByZXAoY29zdHMsIG5yb3coZGYpL2xlbmd0aChjb3N0cykpCiAgZGYkdmFyX21zIDwtIHJvdW5kKGRmJHZhcl9tcywgNSkKICBkZiRkZXB0aCA8LSBzYXBwbHkoc3Ryc3BsaXQoZGYkUE1lY29fZGVwdGgsICJfIiksICJbWyIsIDIpCiAgZGYkbW9kIDwtIG1vZAogIHJldHVybihkZikKfQp2YXJfbXMuMXAuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjFwLCBjKCJyZXNwIiwgImJ1bGtDIiksICIxcCIpCnZhcl9tcy4xcC5sYWcuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjFwLmxhZywgYygicmVzcCIsICJidWxrQyIpLCAiMXAsIGxhZyIpCnZhcl9tcy4ycHAuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjJwcCwgYygicmVzcCIsICJidWxrQyIpLCAiMnBwIikKdmFyX21zLjJwcC5sYWcuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjJwcC5sYWcsIGMoInJlc3AiLCAiYnVsa0MiKSwgIjJwcCwgbGFnIikKdmFyX21zLjJwcy5kZiA8LSB2YXJfbXMuZGYuZngobW9kLmZpdHMuMnBwLmxhZywgYygicmVzcCIsICJidWxrQyIpLCAiMnBzIikKdmFyX21zLjJwcy5sYWcuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjJwcy5sYWcsIGMoInJlc3AiLCAiYnVsa0MiKSwgIjJwcywgbGFnIikKCiMgY29tYmluZSB2YXIgJiBwbG90CnZhci5kZiA8LSByYmluZCgKICB2YXJfbXMuMXAuZGYsCiAgdmFyX21zLjFwLmxhZy5kZiwKICB2YXJfbXMuMnBwLmRmLAogIHZhcl9tcy4ycHAubGFnLmRmLAogIHZhcl9tcy4ycHMuZGYsCiAgdmFyX21zLjJwcy5sYWcuZGYpICU+JSAKICBtdXRhdGUoUE1lY28gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDQpKQp2YXIucGxvdC4ycHAuMnBzLjFwIDwtIHZhci5kZiAlPiUKICBmaWx0ZXIoZGVwdGggPT0gIjAtMTAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFBNZWNvLCB2YXJfbXMsIGZpbGwgPSBtb2QpKSArIAogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyAKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHZhciksIHNjYWxlcyA9ICJmcmVlIikgKyAKICB0aGVtZV9idygpICsgCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBwbG90LW1vZEZpdC1zc3IsIGV2YWwgPSBGQUxTRX0KIyBTU1IKc3NyLnBsb3QuMnBwLjJwcyA8LSByYmluZChzc3IuMnBwLmRmLCBzc3IuMnBzLmRmKSAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkdScmZfMTAtMjAiICYgUE1lY29fZGVwdGggIT0gIkdScmZfMjAtMzAiKSAlPiUKICBtdXRhdGUobW9kID0gcmVwKGMoIjJwcCIsICIycHMiKSwgZWFjaCA9IDI1KSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBmYWN0b3IoCiAgICAgICAgICAgc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSwgbGFiZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KFBNZWNvX2RlcHRoLCAiXyIpLCAiWyIsIDIpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFBNLCBzc3IsIGZpbGwgPSBQTSwgYWxwaGEgPSBtb2QpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAiTW9kZWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIycHAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMnBzIiA9IC41KSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGRlcHRoKSwgcm93cyA9IHZhcnMoZWNvKSkgKwogIGdndGl0bGUoIlNTUiAyLXBvb2wgbW9kZWxzIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCnNzci5wbG90LjJwcC4ycHMKYGBgCgojIyBtb2RGaXQgQUlDCgpMYWdnZWQgMi1wb29sIG1vZGVscyBoYXZlIGhpZ2hlciBBSUMgdmFsdWVzIHRoYW4gdGhlIG5vbi1sYWdnZWQgbW9kZWxzIGZvciBhbGwgc2l0ZXMgZXhjZXB0IGZvciB0aGUgZGVlcGVyIGxheWVycyBhdCB0aGUgR1JyZiBzaXRlcyAoZm9yIHdoaWNoIHRoZSBtb2RlbHMgZml0IHBvb3JseSBhbnl3YXkpLiAKCldoZW4gY29tcGFyaW5nIGxhZ2dlZCAxLXBvb2wgbW9kZWxzIHRvIHRoZSAyLXBvb2wgbW9kZWxzIHdpdGhvdXQgYSBsYWcsIHRoZSAyLXBvb2wgbW9kZWxzIHBlcmZvcm0gYmV0dGVyIGF0IHRoZSBzb2lsIHN1cmZhY2UsIGJ1dCB0aGUgMS1wb29sIG1vZGVscyBwZXJmb3JtIHNsaWdodGx5IGJldHRlciBhdCB0aGUgZGVlcGVzdCBkZXB0aC4gUGVyZm9ybWFuY2UgZm9yIHRoZSAxMC0yMCBjbSBsYXllciBpcyBtaXhlZC4gSW4gZ2VuZXJhbCwgdGhlIDEtcG9vbCBtb2RlbHMgcGVyZm9ybSBiZXR0ZXIgdGhhbiAyLXBvb2wgbW9kZWxzIGZvciB0aGUgd2FybSBjbGltYXRlIHNpdGVzLCB3aGlsZSB0aGUgMi1wb29sIG1vZGVscyBwZXJmb3JtIGJldHRlciBhdCB0aGUgY29sZCBjbGltYXRlIHNpdGVzLiBGb3IgdGhlIGNvb2wgY2xpbWF0ZSBzaXRlcywgdGhlIDItcG9vbCBtb2RlbHMgcGVyZm9ybSBiZXR0ZXIgZm9yIGFuZGVzaXRpYyBwYXJlbnQgbWF0ZXJpYWxzOyBob3dldmVyLCBiYXNhbHRpYyBhbmQgZ3Jhbml0aWMgc29pbHMgZm9sbG93IHRoZSBvdmVyYWxsIGRlcHRoIHRyZW5kczogd2l0aCBiZXR0ZXIgcGVyZm9ybWFuY2Ugb2YgdGhlIDItcG9vbCBtb2RlbHMgYXQgdGhlIHNvaWwgc3VyZmFjZSwgYW5kIGJldHRlciBwZXJmb3JtYW5jZSBvZiB0aGUgMS1wb29sIG1vZGVscyBhdCB0aGUgZGVlcGVzdCBkZXB0aC4KCmBgYHtyIG1vZEZpdC1haWN9CiMgZnggZm9yIEFJQyBjYWxjCmFpYy5GTUUgPC0gZnVuY3Rpb24oZml0LCBmaXRfdHlwZSkgewogIGlmIChmaXRfdHlwZSA9PSAibW9kRml0IikgewogICAgbXMgPC0gZml0JG1zCiAgfSBlbHNlIHsKICAgIG1zIDwtIGZpdCRiZXN0ZnVucCAvIGxlbmd0aChmaXQkcmVzaWR1YWxzKQogIH0KICAyICogbGVuZ3RoKGZpdCRwYXIpICsgMiAqIGxvZyhtcykKfQoKYWljLjFwLmxhZyA8LSBsYXBwbHkobW9kLmZpdHMuMXAubGFnLCBhaWMuRk1FLCBmaXRfdHlwZSA9ICJtb2RGaXQiKQphaWMuMnBwLmxhZyA8LSBsYXBwbHkobW9kLmZpdHMuMnBwLmxhZywgYWljLkZNRSwgZml0X3R5cGUgPSAibW9kRml0IikKYWljLjJwcy5sYWcgPC0gbGFwcGx5KG1vZC5maXRzLjJwcy5sYWcsIGFpYy5GTUUsIGZpdF90eXBlID0gIm1vZEZpdCIpCmFpYy4ycHAgPC0gbGFwcGx5KG1vZC5maXRzLjJwcCwgYWljLkZNRSwgZml0X3R5cGUgPSAibW9kRml0IikKYWljLjJwcyA8LSBsYXBwbHkobW9kLmZpdHMuMnBzLCBhaWMuRk1FLCBmaXRfdHlwZSA9ICJtb2RGaXQiKQphaWMuM3BwIDwtIGxhcHBseShtb2QuZml0cy4zcHAsIGFpYy5GTUUsIGZpdF90eXBlID0gIm1vZEZpdCIpCmFpYy4zcHMgPC0gbGFwcGx5KG1vZC5maXRzLjNwcywgYWljLkZNRSwgZml0X3R5cGUgPSAibW9kRml0IikKCiMgY29tcGFyZSBBSUMgdmFsdWVzIGFuZCBjYWxjdWxhdGUgZGVsdGFfaQphaWMuZGVsdGFfaS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGFpYy4xcC5sYWcpLCBmdW5jdGlvbihpKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShhaWMgPSBjKGFpYy4xcC5sYWdbW2ldXSwKICAgICAgICAgICAgICAgICAgICAgYWljLjJwcFtbaV1dLAogICAgICAgICAgICAgICAgICAgICBhaWMuMnBwLmxhZ1tbaV1dLAogICAgICAgICAgICAgICAgICAgICBhaWMuMnBzW1tpXV0sCiAgICAgICAgICAgICAgICAgICAgIGFpYy4ycHMubGFnW1tpXV0sCiAgICAgICAgICAgICAgICAgICAgIGFpYy4zcHBbW2ldXSwKICAgICAgICAgICAgICAgICAgICAgYWljLjNwc1tbaV1dKSwKICAgICAgICAgICAgIG1vZCA9IGMoIjFwLmxhZyIsCiAgICAgICAgICAgICAgICAgICAgICIycHAiLAogICAgICAgICAgICAgICAgICAgICAiMnBwLmxhZyIsCiAgICAgICAgICAgICAgICAgICAgICIycHMiLAogICAgICAgICAgICAgICAgICAgICAiMnBzLmxhZyIsCiAgICAgICAgICAgICAgICAgICAgICIzcHAiLAogICAgICAgICAgICAgICAgICAgICAiM3BzIikpCiAgYWljLm1pbiA8LSBtaW4oZGYkYWljKQogIGRmJGFpY19pIDwtIGRmJGFpYyAtIGFpYy5taW4KICByZXR1cm4oZGYpCn0pCm5hbWVzKGFpYy5kZWx0YV9pLmxzKSA8LSBuYW1lcyhhaWMuMXAubGFnKQphaWMuZGVsdGFfaSA8LSBiaW5kX3Jvd3MoYWljLmRlbHRhX2kubHMsIC5pZCA9ICJQTWVjb19kZXB0aCIpCgojIHBsb3QgQUlDCiMjIDJwcApkYXRhLmZyYW1lKHBtID0gc3Vic3RyKG5hbWVzKGFpYy4ycHAubGFnKSwgMSwgMiksIAogICAgICAgICAgIGVjbyA9IHN1YnN0cihuYW1lcyhhaWMuMnBwLmxhZyksIDMsIDQpLCAKICAgICAgICAgICBkZXB0aCA9IHNhcHBseShzdHJzcGxpdChuYW1lcyhhaWMuMnBwLmxhZyksICJfIiksICJbWyIsIDIpLCAKICAgICAgICAgICBtb2QgPSByZXAoYygiMnBwIiwgIjJwcCwgbGFnIiksIGVhID0gbGVuZ3RoKGFpYy4ycHAubGFnKSksIAogICAgICAgICAgIGFpYyA9IGModW5saXN0KGFpYy4ycHApLCB1bmxpc3QoYWljLjJwcC5sYWcpKSkgJT4lIAogIGdncGxvdCguLCBhZXMocG0sIGFpYywgZmlsbCA9IG1vZCkpICsgCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhlY28pKSArIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMjIDJwcwpkYXRhLmZyYW1lKHBtID0gc3Vic3RyKG5hbWVzKGFpYy4ycHMubGFnKSwgMSwgMiksIAogICAgICAgICAgIGVjbyA9IHN1YnN0cihuYW1lcyhhaWMuMnBzLmxhZyksIDMsIDQpLCAKICAgICAgICAgICBkZXB0aCA9IHNhcHBseShzdHJzcGxpdChuYW1lcyhhaWMuMnBzLmxhZyksICJfIiksICJbWyIsIDIpLCAKICAgICAgICAgICBtb2QgPSByZXAoYygiMnBzIiwgIjJwcywgbGFnIiksIGVhID0gbGVuZ3RoKGFpYy4ycHMubGFnKSksIAogICAgICAgICAgIGFpYyA9IGModW5saXN0KGFpYy4ycHMpLCB1bmxpc3QoYWljLjJwcy5sYWcpKSkgJT4lIAogIGdncGxvdCguLCBhZXMocG0sIGFpYywgZmlsbCA9IG1vZCkpICsgCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhlY28pKSArIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIDFwIHZzIDJwcApkYXRhLmZyYW1lKHBtID0gc3Vic3RyKG5hbWVzKGFpYy4ycHAubGFnKSwgMSwgMiksIAogICAgICAgICAgIGVjbyA9IGZhY3RvcigKICAgICAgICAgICAgIHN1YnN0cihuYW1lcyhhaWMuMnBwLmxhZyksIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSwgCiAgICAgICAgICAgZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQobmFtZXMoYWljLjJwcC5sYWcpLCAiXyIpLCAiW1siLCAyKSwKICAgICAgICAgICBhaWMuZGlmID0gYyh1bmxpc3QoYWljLjFwLmxhZykgLSB1bmxpc3QoYWljLjJwcCkpKSAlPiUgCiAgZ2dwbG90KC4sIGFlcyhwbSwgYWljLmRpZiwgZmlsbCA9IGFpYy5kaWYpKSArIAogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50MigpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoZWNvKSkgKyB0aGVtZV9idygpICsKICBsYWJzKHN1YnRpdGxlID0gInJlZCA9IDFwLCBsYWc7IGJsdWUgPSAycHAiKSArCiAgeWxhYigiQUlDIGRpZiAoMXAsIGxhZyAtIDJwcCkiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCmRhdGEuZnJhbWUocG0gPSBzdWJzdHIobmFtZXMoYWljLjJwcC5sYWcpLCAxLCAyKSwgCiAgICAgICAgICAgZWNvID0gZmFjdG9yKAogICAgICAgICAgICAgc3Vic3RyKG5hbWVzKGFpYy4ycHAubGFnKSwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpLCAKICAgICAgICAgICBkZXB0aCA9IHNhcHBseShzdHJzcGxpdChuYW1lcyhhaWMuMnBwLmxhZyksICJfIiksICJbWyIsIDIpLAogICAgICAgICAgIGFpYy5kaWYgPSBjKHVubGlzdChhaWMuMXAubGFnKSAtIHVubGlzdChhaWMuMnBzKSkpICU+JSAKICBnZ3Bsb3QoLiwgYWVzKHBtLCBhaWMuZGlmLCBmaWxsID0gYWljLmRpZikpICsgCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKCkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhlY28pKSArIHRoZW1lX2J3KCkgKwogIGxhYnMoc3VidGl0bGUgPSAicmVkID0gMXAsIGxhZzsgYmx1ZSA9IDJwcyIpICsKICB5bGFiKCJBSUMgZGlmICgxcCwgbGFnIC0gMnBzKSIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIG1vZEZpdC1zZW5zfQojIGV4dHJhY3Qgc2Vuc2l0aXZpdHkgZnJvbSBtb2RGaXQKIyMgMXAsIGxhZwpzZW5zLjFwLmxhZyA8LSBsYXBwbHkobGFwcGx5KG1vZC5zZW5zLmZpdHMuMXAubGFnLCAiW1siLCAic2VucyIpLCBmdW5jdGlvbih4KSB7CiAgbmFtZXMoeClbMzo0XSA8LSBjKCJrIiwgImxhZyIpCiAgcmV0dXJuKHgpIAp9KQojIyAycCBtb2RzCnNlbnMuMnBwIDwtIGxhcHBseShsYXBwbHkobW9kLnNlbnMuZml0cy4ycHAsICJbWyIsICJzZW5zIiksIGZ1bmN0aW9uKHgpIHsKICBuYW1lcyh4KVszOjVdIDwtIGMoImtmYXN0IiwgImtzbG93IiwgImdhbW1hIikKICByZXR1cm4oeCkgCn0pCnNlbnMuMnBwLmxhZyA8LSBsYXBwbHkobGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBwLmxhZywgIltbIiwgInNlbnMiKSwgZnVuY3Rpb24oeCkgewogIG5hbWVzKHgpWzM6Nl0gPC0gYygia2Zhc3QiLCAia3Nsb3ciLCAiZ2FtbWEiLCAibGFnIikKICByZXR1cm4oeCkgCn0pCnNlbnMuMnBzIDwtIGxhcHBseShsYXBwbHkobW9kLnNlbnMuZml0cy4ycHMsICJbWyIsICJzZW5zIiksIGZ1bmN0aW9uKHgpIHsKICBuYW1lcyh4KVszOjVdIDwtIGMoImtmYXN0IiwgImtzbG93IiwgImFscGhhIikKICByZXR1cm4oeCkgCn0pCnNlbnMuMnBzLmxhZyA8LSBsYXBwbHkobGFwcGx5KG1vZC5zZW5zLmZpdHMuMnBzLmxhZywgIltbIiwgInNlbnMiKSwgZnVuY3Rpb24oeCkgewogIG5hbWVzKHgpWzM6Nl0gPC0gYygia2Zhc3QiLCAia3Nsb3ciLCAiYWxwaGEiLCAibGFnIikKICByZXR1cm4oeCkgCn0pCgojIyAzcCBtb2RzCnNlbnMuM3BwIDwtIGxhcHBseShsYXBwbHkobW9kLnNlbnMuZml0cy4zcHAsICJbWyIsICJzZW5zIiksIGZ1bmN0aW9uKHgpIHsKICBuYW1lcyh4KVszOjddIDwtIGMoImtmYXN0IiwgImtzbG93IiwgImtwYXNzaXZlIiwgICJnYW1tYUZhc3QiLCAiZ2FtbWFTbG93IikKICByZXR1cm4oeCkgCn0pCnNlbnMuM3BzIDwtIGxhcHBseShsYXBwbHkobW9kLnNlbnMuZml0cy4zcHMsICJbWyIsICJzZW5zIiksIGZ1bmN0aW9uKHgpIHsKICBuYW1lcyh4KVszOjddIDwtIGMoImtmYXN0IiwgImtzbG93IiwgImtwYXNzaXZlIiwgICJhMjEiLCAiYTMyIikKICByZXR1cm4oeCkgCn0pCmBgYAoKIyMgbW9kRml0IHBhciBzZW5zCgpgYGB7ciBwbG90LXBhci1zZW5zLCBldmFsID0gRkFMU0V9CiMgcGxvdCBzZW5zaXRpdml0eQojIyAxcCwgbGFnCnNlbnMucGxvdC4xcC5sYWcgPC0gbGFwcGx5KHNlbnMuMXAubGFnLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAicmVzcCIpKSkKIyMgMnAKc2Vucy5wbG90LjJwcCA8LSBsYXBwbHkoc2Vucy4ycHAsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJyZXNwIikpKQpzZW5zLnBsb3QuMnBwLmxhZyA8LSBsYXBwbHkoc2Vucy4ycHAubGFnLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAicmVzcCIpKSkKc2Vucy5wbG90LjJwcyA8LSBsYXBwbHkoc2Vucy4ycHMsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJyZXNwIikpKQpzZW5zLnBsb3QuMnBzLmxhZyA8LSBsYXBwbHkoc2Vucy4ycHMubGFnLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAicmVzcCIpKSkKCiMjIDNwCnNlbnMucGxvdC4zcHAgPC0gbGFwcGx5KHNlbnMuM3BwLCBmdW5jdGlvbih4KSBwbG90KHgsIHdoaWNoID0gYygiYnVsa0MiLCAicmVzcCIpKSkKc2Vucy5wbG90LjNwcyA8LSBsYXBwbHkoc2Vucy4zcHMsIGZ1bmN0aW9uKHgpIHBsb3QoeCwgd2hpY2ggPSBjKCJidWxrQyIsICJyZXNwIikpKQpgYGAKCmBgYHtyIG1vZEZpdC1pZGVudH0KIyBsb29rIGF0IGlkZW50aWZpYWJpbGl0eQppbmRlbi5kZi5meCA8LSBmdW5jdGlvbihscykgewogIGxhcHBseShscywgZnVuY3Rpb24oeCkgewogICAgZGYgPC0gY29sbGluKHgpCiAgICBkZiRQYXJDb21ibyA8LSB1bmxpc3QobGFwcGx5KAogICAgICBsYXBwbHkoYXBwbHkoZGYsIDEsIGZ1bmN0aW9uKHgpIHdoaWNoKHggPT0gMSkpLCBuYW1lcyksIGZ1bmN0aW9uKHkpIHsKICAgICAgICBwYXN0ZSh5LCBjb2xsYXBzZSA9ICIgKyAiKQogICAgICB9KSkKICAgIHJldHVybihkZikKICB9KQp9CgojIGZ1bmN0aW9uIHRvIElEIHNpdGVzIHdoZXJlIGZ1bGwgcGFyIHNldCBjYW5ub3QgYmUgSURlZAppZGVuLmZhaWwuZnggPC0gZnVuY3Rpb24obHMpIHsKICBpZHNldCA8LSBiaW5kX3Jvd3MoCiAgICAgIGxhcHBseShscywgZnVuY3Rpb24oeCkgeFt3aGljaCh4JGNvbGxpbmVhcml0eSA8PSAyMCAmIHgkTiA9PSBtYXgoeCROKSksIF0pLAogICAgICAuaWQgPSAiUE1lY29fZGVwdGgiKQogIGZhaWxlZCA8LSBuYW1lcyhscylbIShuYW1lcyhscykgJWluJSBpZHNldCRQTWVjb19kZXB0aCldCiAgbGlzdCgiaWRzZXQiID0gaWRzZXQsICJmYWlsZWQiID0gZmFpbGVkLCAibl9pZCIgPSBsZW5ndGgobHMpIC0gbGVuZ3RoKGZhaWxlZCkpCn0KCiMgMXAsIGxhZwppZGVuLjFwLmxhZyA8LSBsYXBwbHkoc2Vucy4xcC5sYWcsIGZ1bmN0aW9uKHgpIGNvbGxpbih4KSAlPiUgbXV0YXRlKFBhckNvbWJvID0gImsgKyBsYWciKSkKaWRlbi4xcC5kZiA8LSBpZGVuLmZhaWwuZngoaWRlbi4xcC5sYWcpCgojIDJwIG1vZHMKIyMgcHAKaWRlbi4ycHAgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHApCmlkZW4uMnBwLmRmIDwtIGlkZW4uZmFpbC5meChpZGVuLjJwcCkKCiMgdy8gbGFnCmlkZW4uMnBwLmxhZyA8LSBpbmRlbi5kZi5meChzZW5zLjJwcC5sYWcpCmlkZW4uMnBwLmxhZy5kZiA8LSBpZGVuLmZhaWwuZngoaWRlbi4ycHAubGFnKQoKCiMjIHBzICAKaWRlbi4ycHMgPC0gaW5kZW4uZGYuZngoc2Vucy4ycHMpCmlkZW4uMnBzLmRmIDwtIGlkZW4uZmFpbC5meChpZGVuLjJwcykKCiMgdy8gbGFnCmlkZW4uMnBzLmxhZyA8LSBpbmRlbi5kZi5meChzZW5zLjJwcy5sYWcpCmlkZW4uMnBzLmxhZy5kZiA8LSBpZGVuLmZhaWwuZngoaWRlbi4ycHMubGFnKQoKCiMgM3AgbW9kcwojIyBwcAppZGVuLjNwcCA8LSBpbmRlbi5kZi5meChzZW5zLjNwcCkKaWRlbi4zcHAuZGYgPC0gaWRlbi5mYWlsLmZ4KGlkZW4uM3BwKQoKIyMgcHMKaWRlbi4zcHMgPC0gaW5kZW4uZGYuZngoc2Vucy4zcHMpCmlkZW4uM3BzLmRmIDwtIGlkZW4uZmFpbC5meChpZGVuLjNwcykKCgojIGlkZW50aWZpYWJpbGl0eSBwbG90IGZ1bmN0aW9uCmNvbGwucGxvdC5meCA8LSBmdW5jdGlvbihkZiwgbW9kLCBQTWVjb19kZXB0aCwgY29sLm1heCkgewogIAogICMgc2V0IGNvbG9yIHZhbHVlcwogIGN2YWxzIDwtIGMoImtmYXN0ICsga3Nsb3ciID0gIiNFRjQ3NkYiLAogICAgICAgICAgICAgImtmYXN0ICsgZ2FtbWEiID0gIiNGRkQxNjYiLAogICAgICAgICAgICAgImtzbG93ICsgZ2FtbWEiID0gIiMxMThBQjIiLAogICAgICAgICAgICAgImtmYXN0ICsga3Nsb3cgKyBnYW1tYSIgPSAiMDczQjRDIikKICBpZiAoZ3JlcGwoImxhZyIsIG1vZCkpIHsKICAgIGN2YWxzIDwtIGMoY3ZhbHMsICIiKQogIH0KICBpZiAoZ3JlcGwoInBzIiwgbW9kKSkgewogICAgbmFtZXMoY3ZhbHMpIDwtIGdzdWIoImdhbW1hIiwgImFscGhhIiwgbmFtZXMoY3ZhbHMpKQogIH0KICAKICBnZ3Bsb3QoZGYsIGFlcyhOLCBsb2coY29sbGluZWFyaXR5KSwgY29sb3IgPSBQYXJDb21ibykpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGxvZygyMCkpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMuNSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC4xKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgICBuYW1lID0gIlBhcmFtZXRlciBjb21iaW5hdGlvbiIsCiAgICAgIHZhbHVlcyA9IGN2YWxzKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCBsb2coY29sLm1heCkpKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLjUsIDMuNSksIGJyZWFrcyA9IGMoMiwgMykpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZTAoUE1lY29fZGVwdGgsICIsICIsIG1vZCkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKfQoKCiMgIyBjaGVjayBudW1iZXIgb2YgcGFyIGNvbWJvcyB3LyBjb2xsaW4gPCAyMCBAIE4gPSA0IHwgNSB8IDYKIyAjIE4gPSA0CiMgRmlsdGVyKGxlbmd0aCwgbGFwcGx5KGxhcHBseShsYXBwbHkobW9kLnNlbnMuZml0cy4zcHAubGFnMiwgIltbIiwgMiksIGNvbGxpbiksIGZ1bmN0aW9uKHgpIHsKIyAgIHdoaWNoKHhbeCROID09IDQsIDhdIDwgMjApCiMgfSkpCiMgIyBBTnJmXzAtMTAsIEFOcmZfMjAtMzAsIEFOd2ZfMC0xMCwgQU53Zl8xMC0yMCwgQU53Zl8yMC0zMCwgQlNyZl8wLTEwLCBCU3JmXzEwLTIwLCBCU3JmXzIwLTMwLCBCU3dmXzEwLTIwLCBHUnBwXzAtMTAsIEdScmZfMC0xMCwgR1J3Zl8wLTEwCiMgCiMgIyBOID0gNQojIEZpbHRlcihsZW5ndGgsIGxhcHBseShsYXBwbHkobGFwcGx5KG1vZC5zZW5zLmZpdHMuM3BwLmxhZzIsICJbWyIsIDIpLCBjb2xsaW4pLCBmdW5jdGlvbih4KSB7CiMgICB3aGljaCh4W3gkTiA9PSA1LCA4XSA8IDIwKQojIH0pKQojICMgQlN3Zl8xMC0yMCwgR1JyZl8wLTEwCiMgCiMgIyBOID0gNgojIEZpbHRlcihsZW5ndGgsIGxhcHBseShsYXBwbHkobGFwcGx5KG1vZC5zZW5zLmZpdHMuM3BwLmxhZzIsICJbWyIsIDIpLCBjb2xsaW4pLCBmdW5jdGlvbih4KSB7CiMgICB3aGljaCh4W3gkTiA9PSA2LCA4XSA8IDIwKQojIH0pKQojICMgbm9uZQpgYGAKCiMjIG1vZEZpdCBpZGVudGlmaWFiaWxpdHkKClBhcmFtZXRlciBjb21iaW5hdGlvbiBvZiBsZW5ndGggPiAyIGFyZSByYXJlbHkgaWRlbnRpZmlhYmxlCgpgYGB7ciBwbG90LWlkZW50LCBldmFsID0gRkFMU0V9CiMgcGxvdAppZC5wbG90LjJwcCA8LSBsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBwKVtpeC4xMF0sIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHBbW2ldXSwgIjJwcCIsIG5hbWVzKGlkZW4uMnBwKVtpXSwgbWF4KGlkZW4uMnBwW1tpXV1bImNvbGxpbmVhcml0eSJdKSkKfSkKaWQucGxvdC4ycHAubGFnIDwtIGxhcHBseShzZXFfYWxvbmcoaWRlbi4ycHAubGFnKSwgZnVuY3Rpb24oaSkgewogIGNvbGwucGxvdC5meChpZGVuLjJwcC5sYWdbW2ldXSwgIjJwcCwgbGFnIiwgbmFtZXMoaWRlbi4ycHAubGFnKVtpXSwKICAgICAgICAgICAgICAgbWF4KGlkZW4uMnBwW1tpXV1bImNvbGxpbmVhcml0eSJdKSkKfSkKaWQucGxvdC4ycHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhpZGVuLjJwcylbaXguMTBdLCBmdW5jdGlvbihpKSB7CiAgY29sbC5wbG90LmZ4KGlkZW4uMnBzW1tpXV0sICIycHMiLCBuYW1lcyhpZGVuLjJwcylbaV0sIG1heChpZGVuLjJwc1tbaV1dWyJjb2xsaW5lYXJpdHkiXSkpCn0pCmlkLnBsb3QuMnBzLmxhZyA8LSBsYXBwbHkoc2VxX2Fsb25nKGlkZW4uMnBzLmxhZyksIGZ1bmN0aW9uKGkpIHsKICBjb2xsLnBsb3QuZngoaWRlbi4ycHMubGFnW1tpXV0sICIycHMsIGxhZyIsIG5hbWVzKGlkZW4uMnBzLmxhZylbaV0sCiAgICAgICAgICAgICAgIG1heChpZGVuLjJwcy5sYWdbW2ldXVsiY29sbGluZWFyaXR5Il0pKQp9KQpgYGAKCiMjIElucHV0cwoKRm9yIHRoZSAycHAgbW9kZWxzIHRoZSBzaXRlcyBBTnBwIDAtMTAgYW5kIEJTd2YgMTAtMjAgJiAyMC0zMCBoYWQgbXVjaCBoaWdoZXIgaW5wdXRzIHRoYW4gdGhlIG90aGVyIHNpdGVzLiBGb3IgdGhlIDJwcyBtb2RlbHMgaXQncyB0aGUgc2FtZSwgd2l0aCB0aGUgYWRkaXRpb24gb2YgR1J3ZiAxMC0yMC4gU2l0ZXMgQU5wcCAwLTEwIGFuZCBCU3dmIDIwLTMwIGFsc28gaGF2ZSBhbm9tYWxvdXNseSBoaWdoIG1lYW4gYWdlcy4gQWxsIG9mIHRoZSBzaXRlcyB3aXRoIGhpZ2ggaW5wdXRzIGhhdmUgdHJhbnNpdCB0aW1lcyB+IDEgeXIgKFRUIGZvciBBTnBwIDAtMTAgPSA5IHlyKSwgaW4gY29udHJhc3QgdG8gdmFsdWVzIHJhbmdpbmcgZnJvbSA2MCB5cnMgdG8gIGh1bmRyZWRzIG9mIHlycy4KCklucHV0cyBmb3IgM3BwIG1vZGVscyBub3QgbXVjaCBkaWZmZXJlbnQgZnJvbSAycHAgbW9kZWxzLCBhbGhvdWdoIHRoZXJlIGlzIGEgdGVuZGVuY3kgdG8gYmUgc2xpZ2h0bHkgZ3JlYXRlci4KCmBgYHtyIGFkanVzdC1pbnB1dHN9CiMjIDEuIEZpdCBpbnB1dHMgdG8gbW9kZWxlZCBzdG9ja3MKIyBmdW5jdGlvbiBmb3IgZml0dGluZyBpbnB1dCB0byBtb2RlbGVkIHN0b2Nrcwppbi5maXQuZnggPC0gZnVuY3Rpb24ocGFyLmxzLCBtb2RTdHIsIGluaXRJbi5scywgcmVzID0gNTAwKSB7CiAgCiAgIyBnZXQgbmFtZXMKICBubXMgPC0gbmFtZXMocGFyLmxzKQogIAogICMgY2hlY2sgcGFyIGxlbmd0aAogIGlmIChncmVwbCgiM3AiLCBtb2RTdHIpKSB7CiAgICBwYXIubGVuIDwtIDUKICB9IGVsc2UgaWYgKGdyZXBsKCIycCIsIG1vZFN0cikpIHsKICAgIHBhci5sZW4gPC0gMwogIH0gZWxzZSB7CiAgICBwYXIubGVuIDwtIDEKICB9CiAgCiAgbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXIubHMpLCBmdW5jdGlvbihpKSB7CiAgICAKICAgICMgcmVtb3ZlIGxhZyBmcm9tIHBhcnMgYXMgbmVlZGVkCiAgICBQQVJTIDwtIHBhci5sc1tbaV1dWzE6cGFyLmxlbl0KICAgIAogICAgIyBzZXF1ZW5jZSBvZiBwb3NzaWJsZSBpbnB1dCB2YWx1ZXMKICAgIFNPQyA8LSBjc29jLjE5LjBfMzBbW2ldXVtbImx5cl9zb2MiXV0KICAgIElOIDwtIGluaXRJbi5sc1tbaV1dCgogICAgaWYgIChTT0MgPCBzb2MuZngoUEFSUywgbW9kU3RyLCBJTiwgInN1bSIpKSB7CiAgICAgIAogICAgICAjIGJ5IHN0ZXA7IGZsb29yIHNldCBhdCAuMDAxCiAgICAgIGJ5U3RlcCA8LSAoSU4gLSAuMDAxKSAvIHJlcyAKICAgICAgCiAgICAgICMgaW4gdmVjdG9yCiAgICAgIGlucyA8LSBzZXEoLjAwMSwgCiAgICAgICAgICAgICAgICAgSU4sIAogICAgICAgICAgICAgICAgIGJ5U3RlcCkKICAgIH0gZWxzZSB7CiAgICAgIAogICAgICAjIGJ5IHN0ZXA7IGNlaWxpbmcgc2V0IGF0IFNPQwogICAgICBieVN0ZXAgPC0gKFNPQyAtIElOKSAvIHJlcyAKICAgICAgCiAgICAgICMgaW4gdmVjdG9yCiAgICAgIGlucyA8LSBzZXEoSU4sIAogICAgICAgICAgICAgICAgIFNPQywgCiAgICAgICAgICAgICAgICAgYnlTdGVwKQogICAgfQogICAgCiAgICAjIG1vZGVsZWQgc3RvY2tzCiAgICBzb2NfbW9kIDwtIGxhcHBseShzZXFfYWxvbmcoaW5zKSwgZnVuY3Rpb24oaikgc29jLmZ4KFBBUlMsIG1vZFN0ciwgaW5zW2pdLCAic3VtIikpCiAgICByb3VuZChpbnNbd2hpY2gubWluKGFicyh1bmxpc3Qoc29jX21vZCkgLSBTT0MpKV0sIDMpCiAgfSkKICBuYW1lcyhscykgPC0gbm1zCiAgcmV0dXJuKGxzKQp9CgojIyAxcAppbi5maXQuMXAgPC0gaW4uZml0LmZ4KHBhcnMuZml0LjFwLCAiMXAiLCBpbi4xLmxzKQppbi5maXQuMXAubGFnIDwtIGluLmZpdC5meChwYXJzLmZpdC4xcC5sYWcsICIxcCIsIGluLjEubHMpCgojIyAycAojIyMgcHAKaW4uZml0LjJwcCA8LSBpbi5maXQuZngocGFycy5maXQuMnBwLCAiMnBwIiwgaW4uMS5scykKaW4uZml0LjJwcC5sYWcgPC0gaW4uZml0LmZ4KHBhcnMuZml0LjJwcC5sYWcsICIycHAiLCBpbi4xLmxzKSAKCiMjIHBzCmluLmZpdC4ycHMgPC0gaW4uZml0LmZ4KHBhcnMuZml0LjJwcywgIjJwcyIsIGluLjEubHMpCmluLmZpdC4ycHMubGFnIDwtIGluLmZpdC5meChwYXJzLmZpdC4ycHMubGFnLCAiMnBzIiwgaW4uMS5scykgCgoKIyAzcAojIyBwcAppbi5maXQuM3BwIDwtIGluLmZpdC5meChwYXJzLmZpdC4zcHAsICIzcHAiLCBpbi4xLmxzKQppbi5maXQuM3BwLmxhZyA8LSBpbi5maXQuZngocGFycy5maXQuM3BwLmxhZywgIjNwcCIsIGluLjEubHMpCgojIyBwcyAKaW4uZml0LjNwcyA8LSBpbi5maXQuZngocGFycy5maXQuM3BzLCAiM3BzIiwgaW4uMS5scykKaW4uZml0LjNwcy5sYWcgPC0gaW4uZml0LmZ4KHBhcnMuZml0LjNwcy5sYWcsICIzcHMiLCBpbi4xLmxzKQoKCiMjIDIuIEZpdCBzdG9ja3MgdG8gZXN0aW1hdGVkIGlucHV0cwojIEZsdXhlcyBlc3RpbWF0ZWQgZnJvbSBHb3VsZGVuIGV0IGFsLiAyMDEyOyBUYW5nIGV0IGFsLiAyMDA1OyBXYW5nIGV0IGFsLiAyMDAwOyBHYXVkaW5za2kgMjAwMApncHAubHMgPC0gYygxLjgsIDEuNiwgMS40KSAjIEdQUCBieSBlbGV2YXRpb24gKGtnQyBtXi0yIHlyXi0xKSAoR291bGRlbiBldCBhbC4gMjAxMiwgRmlnLiA1KQoKIyBTb2lsIHJlc3AgJSAoUmgpID0gMTE4NCAvICgxMTg0ICsgNTI0KSB+IDAuMyAoVGFuZyBldCBhbC4gMjAwNSwgYW5uLiBtZWFuIEJsb2RnZXR0OyBjZi4gMC40OCBASGFydmFyZCBGb3Jlc3QpCiMgQSBob3Jpem9uIGNvbnRyaWJ1dGlvbiB0byBSaCA9IDAuNTUgKGVzdC4gZnJvbSBHYXVkaW5za2kgZXQgYWwuIDIwMDAsIEhhcnZhcmQgRm9yZXN0IHN0dWR5KQpoem5BLlJoLmtnbTIgPC0gMC4zICogMC41NQoKIyBBZGp1c3QgaW5wdXRzIGJ5IGRlcHRoIChhc3N1bWluZyBBID0gMC0zMCk6IDAtMTAgPSA1MCUsIDEwLTIwID0gMzAlLCAyMC0zMCA9IDIwJSAKaW4uZnJjLmxzIDwtIGMoMC41LCAwLjMsIDAuMikKCiMgZnggZm9yIGNhbGN1bGF0aW5nIGlucHV0cwppbi5mbHguZnggPC0gZnVuY3Rpb24oUE1lY29fZGVwdGgpIHsKICBncHAgPC0gaWZlbHNlKGdyZXBsKCJwcCIsIFBNZWNvX2RlcHRoKSwgZ3BwLmxzWzFdLCBpZmVsc2UoZ3JlcGwoIndmIiwgUE1lY29fZGVwdGgpLCBncHAubHNbMl0sIGdwcC5sc1szXSkpCiAgaW4uZnJjIDwtIGlmZWxzZShncmVwbCgiMC0xMCIsIFBNZWNvX2RlcHRoKSwgaW4uZnJjLmxzWzFdLCBpZmVsc2UoZ3JlcGwoIjEwLTIwIiwgUE1lY29fZGVwdGgpLCBpbi5mcmMubHNbMl0sIGluLmZyYy5sc1szXSkpCiAgZ3BwICogaW4uZnJjICogaHpuQS5SaC5rZ20yCn0KCiMgRXN0aW1hdGUgaW5wdXRzCmluLmVzdCA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuaS4ycHApLCBmdW5jdGlvbihpKSB7CiAgUE1lY29fZGVwdGggPC0gbmFtZXMocGFycy5pLjJwcClbaV0KICBpbi5mbHguZngoUE1lY29fZGVwdGgpCn0pCm5hbWVzKGluLmVzdCkgPC0gbmFtZXMocGFycy5pLjJwcCkKYGBgCgpgYGB7ciBwbG90LWlucHV0cywgZXZhbCA9IEZBTFNFfQppbi5lc3QucGxvdCA8LSBiaW5kX3Jvd3MobGFwcGx5KGluLmVzdCwgZnVuY3Rpb24oeCkgZGF0YS5mcmFtZShJbiA9IHgpKSwgLmlkID0gIlBNZWNvX2RlcHRoIikgJT4lCiAgbXV0YXRlKFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gZmFjdG9yKAogICAgICAgICAgIHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIiksIGxhYmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkZXB0aCA9IHN1YnN0cihQTWVjb19kZXB0aCwgNiwgbmNoYXIoUE1lY29fZGVwdGgpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhlY28sIEluKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAuNSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgppbi5maXQuMnBwLnBsb3QgPC0gYmluZF9yb3dzKGxhcHBseShpbi5maXQuMnBwLCBmdW5jdGlvbih4KSBkYXRhLmZyYW1lKEluID0geCkpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBFQ08gPSBmYWN0b3IoCiAgICAgICAgICAgc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSwgbGFiZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIGRlcHRoID0gc3Vic3RyKFBNZWNvX2RlcHRoLCA2LCBuY2hhcihQTWVjb19kZXB0aCkpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFBNLCBJbiwgZmlsbCA9IFBNKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIC41KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhFQ08pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCmluLmZpdC4ycHMucGxvdCA8LSBiaW5kX3Jvd3MobGFwcGx5KGluLmZpdC4ycHMsIGZ1bmN0aW9uKHgpIGRhdGEuZnJhbWUoSW4gPSB4KSksIC5pZCA9ICJQTWVjb19kZXB0aCIpICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIEVDTyA9IGZhY3RvcigKICAgICAgICAgICBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpLCBsYWJlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZGVwdGggPSBzdWJzdHIoUE1lY29fZGVwdGgsIDYsIG5jaGFyKFBNZWNvX2RlcHRoKSkpICU+JQogIGdncGxvdCguLCBhZXMoUE0sIEluLCBmaWxsID0gUE0pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgLjUpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKEVDTykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyAycHAgdnMuIDJwcwppbi5maXQuMnAuMnBzLnBsb3QgPC0gcmJpbmQoCiAgYmluZF9yb3dzKGxhcHBseShpbi5maXQuMnBwLCBmdW5jdGlvbih4KSBkYXRhLmZyYW1lKEluID0geCkpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSwKICBiaW5kX3Jvd3MobGFwcGx5KGluLmZpdC4ycHMsIGZ1bmN0aW9uKHgpIGRhdGEuZnJhbWUoSW4gPSB4KSksIC5pZCA9ICJQTWVjb19kZXB0aCIpKSAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMTAtMjAiICYgUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiKSAlPiUKICBtdXRhdGUobW9kID0gcmVwKGMoIjJwcCwgbGFnIiwgIjJwcywgbGFnIiksIGVhID0gMjUpLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIEVDTyA9IGZhY3RvcigKICAgICAgICAgICBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpLCBsYWJlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZGVwdGggPSBzdWJzdHIoUE1lY29fZGVwdGgsIDYsIG5jaGFyKFBNZWNvX2RlcHRoKSkpICU+JQogIGdncGxvdCguLCBhZXMoUE0sIEluLCBmaWxsID0gUE0sIGFscGhhID0gbW9kKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoIjJwcCwgbGFnIiA9IDEsICIycHMsIGxhZyIgPSAuNSkpICsKICAjIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAuNSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoRUNPKSwgc2NhbGVzID0gImZyZWUiKSArCiAgbGFicyh0aXRsZSA9ICIycHAgdnMuIDJwcyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyAycHAgdnMuIDJwcyB3LyBsYWdzCmluLmZpdC4ycC4ycHMubGFnLnBsb3QgPC0gcmJpbmQoCiAgYmluZF9yb3dzKGxhcHBseShpbi5maXQuMnBwLmxhZywgZnVuY3Rpb24oeCkgZGF0YS5mcmFtZShJbiA9IHgpKSwgLmlkID0gIlBNZWNvX2RlcHRoIiksCiAgYmluZF9yb3dzKGxhcHBseShpbi5maXQuMnBzLmxhZywgZnVuY3Rpb24oeCkgZGF0YS5mcmFtZShJbiA9IHgpKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiQlN3Zl8xMC0yMCIgJiBQTWVjb19kZXB0aCAhPSAiQlN3Zl8yMC0zMCIpICU+JQogIG11dGF0ZShtb2QgPSByZXAoYygiMnBwLCBsYWciLCAiMnBzLCBsYWciKSwgZWEgPSAyNSksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgRUNPID0gZmFjdG9yKAogICAgICAgICAgIHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIiksIGxhYmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkZXB0aCA9IHN1YnN0cihQTWVjb19kZXB0aCwgNiwgbmNoYXIoUE1lY29fZGVwdGgpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhQTSwgSW4sIGZpbGwgPSBQTSwgYWxwaGEgPSBtb2QpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygiMnBwLCBsYWciID0gMSwgIjJwcywgbGFnIiA9IC41KSkgKwogICMgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIC41KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhFQ08pLCBzY2FsZXMgPSAiZnJlZSIpICsKICBsYWJzKHRpdGxlID0gIjJwcCB2cy4gMnBzIChsYWdnZWQpIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGNvbXBhcmUgdy8gYW5kIHcvbyBsYWdzCmluLmZpdC4ycHAubGFnLnBsb3QgPC0gcmJpbmQoCiAgYmluZF9yb3dzKGxhcHBseShpbi5maXQuMnBwLCBmdW5jdGlvbih4KSBkYXRhLmZyYW1lKEluID0geCkpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSwKICBiaW5kX3Jvd3MobGFwcGx5KGluLmZpdC4ycHAubGFnLCBmdW5jdGlvbih4KSBkYXRhLmZyYW1lKEluID0geCkpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkgJT4lCiAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJCU3dmXzEwLTIwIiAmIFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIikgJT4lCiAgbXV0YXRlKG1vZCA9IHJlcChjKCIycHAiLCAiMnBwLCBsYWciKSwgZWEgPSAyNSksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgRUNPID0gZmFjdG9yKAogICAgICAgICAgIHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIiksIGxhYmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkZXB0aCA9IHN1YnN0cihQTWVjb19kZXB0aCwgNiwgbmNoYXIoUE1lY29fZGVwdGgpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhQTSwgSW4sIGZpbGwgPSBQTSwgYWxwaGEgPSBtb2QpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoIjJwcCIgPSAxLCAiMnBwLCBsYWciID0gLjUpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKEVDTyksIHNjYWxlcyA9ICJmcmVlIikgKwogIGxhYnModGl0bGUgPSAiMnBwIHZzLiAycHAsIGxhZyIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKaW4uZml0LjJwcy5sYWcucGxvdCA8LSByYmluZCgKICBiaW5kX3Jvd3MobGFwcGx5KGluLmZpdC4ycHMsIGZ1bmN0aW9uKHgpIGRhdGEuZnJhbWUoSW4gPSB4KSksIC5pZCA9ICJQTWVjb19kZXB0aCIpLAogIGJpbmRfcm93cyhsYXBwbHkoaW4uZml0LjJwcy5sYWcsIGZ1bmN0aW9uKHgpIGRhdGEuZnJhbWUoSW4gPSB4KSksIC5pZCA9ICJQTWVjb19kZXB0aCIpKSAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMTAtMjAiICYgUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiICYgUE1lY29fZGVwdGggIT0gIkdSd2ZfMTAtMjAiKSAlPiUKICBtdXRhdGUobW9kID0gcmVwKGMoIjJwcyIsICIycHMsIGxhZyIpLCBlYSA9IDI0KSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBFQ08gPSBmYWN0b3IoCiAgICAgICAgICAgc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSwgbGFiZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIGRlcHRoID0gc3Vic3RyKFBNZWNvX2RlcHRoLCA2LCBuY2hhcihQTWVjb19kZXB0aCkpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFBNLCBJbiwgZmlsbCA9IFBNLCBhbHBoYSA9IG1vZCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygiMnBzIiA9IDEsICIycHMsIGxhZyIgPSAuNSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoRUNPKSwgc2NhbGVzID0gImZyZWUiKSArCiAgbGFicyh0aXRsZSA9ICIycHMgdnMuIDJwcywgbGFnIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIDJwcCwgMnBzIHcvIGFuZCB3aXRob3V0IGxhZ3MKaW4uZml0LjJwcC5sYWcucGxvdAppbi5maXQuMnBzLmxhZy5wbG90CgojIDJwcCB2cy4gMnBzLCB3LzAgYW5kIHcvIGxhZ3MKaW4uZml0LjJwLjJwcy5wbG90CmluLmZpdC4ycC4ycHMubGFnLnBsb3QKCiMgM3BwCiMgaW4uZml0LjNwcC5sYWcucGxvdCA8LSByYmluZCgKIyAgIGJpbmRfcm93cyhsYXBwbHkoaW4uZml0LjNwcCwgZnVuY3Rpb24oeCkgZGF0YS5mcmFtZShJbiA9IHgpKSwgLmlkID0gIlBNZWNvX2RlcHRoIiksCiMgICBiaW5kX3Jvd3MobGFwcGx5KGluLmZpdC4zcHAubGFnMiwgZnVuY3Rpb24oeCkgZGF0YS5mcmFtZShJbiA9IHgpKSwgLmlkID0gIlBNZWNvX2RlcHRoIikpICU+JQojICAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJCU3dmXzEwLTIwIiAmIFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIikgJT4lCiMgICBtdXRhdGUobW9kID0gcmVwKGMoIjNwcCIsICIzcHAsIGxhZyIpLCBlYSA9IDI1KSwKIyAgICAgICAgICBQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiMgICAgICAgICAgRUNPID0gZmFjdG9yKAojICAgICAgICAgICAgc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSwgbGFiZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiMgICAgICAgICAgZGVwdGggPSBzdWJzdHIoUE1lY29fZGVwdGgsIDYsIG5jaGFyKFBNZWNvX2RlcHRoKSkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhQTSwgSW4sIGZpbGwgPSBQTSwgYWxwaGEgPSBtb2QpKSArCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKIyAgIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIzcHAiID0gMSwgIjNwcCwgbGFnIiA9IC41KSkgKwojICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKEVDTyksIHNjYWxlcyA9ICJmcmVlIikgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIGFnZS10dC1tb2RGaXR9CiMgc3lzdGVtIGFnZSBhbmQgdHJhbnNpdCB0aW1lIGZ1bmN0aW9uCnNhLnR0Lm1vZEZpdC5meCA8LSBmdW5jdGlvbihtb2QsIHBhcnMsIGlucHV0KSB7CiAgCiAgIyBjaGVjayBrIGxlbmd0aAogIGlmIChncmVwbCgiM3AiLCBtb2QpKSB7CiAgICBrLmxlbiA8LSAzCiAgfSBlbHNlIGlmIChncmVwbCgiMnAiLCBtb2QpKSB7CiAgICBrLmxlbiA8LSAyCiAgfQogIAogICMgbW9kZWwgbWF0cml4IGFuZCBpbnB1dHMKICBBIDwtIC0xICogZGlhZyhwYXJzWzE6ay5sZW5dKQogIGlmIChncmVwbCgicHMiLCBtb2QpKSB7CiAgICBpZiAoay5sZW4gPT0gMikgewogICAgICBJbiA8LSBjKGlucHV0LCAwKQogICAgICBBWzIsIDFdIDwtIHBhcnNbWzNdXSAqIHBhcnNbWzFdXQogICAgfSBlbHNlIHsKICAgICAgSW4gPC0gYyhpbnB1dCwgMCwgMCkKICAgICAgQVsyLCAxXSA8LSBwYXJzW1s0XV0gKiBwYXJzW1sxXV0KICAgICAgQVszLCAyXSA8LSBwYXJzW1s1XV0gKiBwYXJzW1syXV0KICAgIH0KICB9IGVsc2UgewogICAgaWYgKGsubGVuID09IDIpIHsKICAgICAgSW4gPC0gYyhpbnB1dCAqIHBhcnNbM10sIGlucHV0ICogKDEgLSBwYXJzWzNdKSkKICAgIH0gZWxzZSB7CiAgICAgIEluIDwtIGMoaW5wdXQgKiBwYXJzWzRdLCBpbnB1dCAqIHBhcnNbNV0sIGlucHV0ICogKDEgLSAocGFyc1s0XSArIHBhcnNbNV0pKSkKICAgIH0KICB9CiAgCiAgIyBTeXN0ZW0gYWdlcyBhbmQgdHJhbnNpdCB0aW1lcwogIGxpc3Qoc3lzdGVtQWdlKEEgPSBBLCB1ID0gSW4pLCB0cmFuc2l0VGltZShBID0gQSwgdSA9IEluKSkKfQoKIyBnZXQgU0EsIFRUCiMjIDFwCnNzLnR0LjFwLmxzIDwtIGxhcHBseShwYXJzLmZpdC4xcCwgZnVuY3Rpb24oeCkgewogIGFnZSA8LSB4Xi0xICogMQogIHRyYW5zaXRUaW1lIDwtIGFnZQogIGxpc3QoYWdlLCB0cmFuc2l0VGltZSkKfSkKIyB3LyBsYWcKc3MudHQuMXAubGFnLmxzIDwtIGxhcHBseShwYXJzLmZpdC4xcC5sYWcsIGZ1bmN0aW9uKHgpIHsKICBhZ2UgPC0geFsxXV4tMSAqIDEKICB0cmFuc2l0VGltZSA8LSBhZ2UKICBsaXN0KGFnZSwgdHJhbnNpdFRpbWUpCn0pCgojIyAycAojIyMgcHAKc2EudHQuMnBwLmxzIDwtIGxhcHBseShwYXJzLmZpdC4ycHAsIGZ1bmN0aW9uKHgpIHNhLnR0Lm1vZEZpdC5meChtb2QgPSAiMnBwIiwgcGFycyA9IHgsIGlucHV0ID0gMSkpCnNhLnR0LjJwcC5sYWcubHMgPC0gbGFwcGx5KHBhcnMuZml0LjJwcC5sYWcsIGZ1bmN0aW9uKHgpIHNhLnR0Lm1vZEZpdC5meChtb2QgPSAiMnBwIiwgcGFycyA9IHgsIGlucHV0ID0gMSkpCgojIyMgcHMKc2EudHQuMnBzLmxzIDwtIGxhcHBseShwYXJzLmZpdC4ycHMsIGZ1bmN0aW9uKHgpIHNhLnR0Lm1vZEZpdC5meChtb2QgPSAiMnBzIiwgcGFycyA9IHgsIGlucHV0ID0gMSkpCnNhLnR0LjJwcy5sYWcubHMgPC0gbGFwcGx5KHBhcnMuZml0LjJwcy5sYWcsIGZ1bmN0aW9uKHgpIHNhLnR0Lm1vZEZpdC5meChtb2QgPSAiMnBzIiwgcGFycyA9IHgsIGlucHV0ID0gMSkpCgojIyAzcAojIyMgcHAKc2EudHQuM3BwLmxzIDwtIGxhcHBseShwYXJzLmZpdC4zcHAsIGZ1bmN0aW9uKHgpIHNhLnR0Lm1vZEZpdC5meChtb2QgPSAiM3BwIiwgcGFycyA9IHgsIGlucHV0ID0gMSkpCnNhLnR0LjNwcC5sYWcubHMgPC0gbGFwcGx5KHBhcnMuZml0LjNwcC5sYWcsIGZ1bmN0aW9uKHgpIHNhLnR0Lm1vZEZpdC5meChtb2QgPSAiM3BwIiwgcGFycyA9IHgsIGlucHV0ID0gMSkpCgojIyMgcHMKc2EudHQuM3BzLmxzIDwtIGxhcHBseShwYXJzLmZpdC4zcHMsIGZ1bmN0aW9uKHgpIHNhLnR0Lm1vZEZpdC5meChtb2QgPSAiM3BzIiwgcGFycyA9IHgsIGlucHV0ID0gMSkpCnNhLnR0LjNwcy5sYWcubHMgPC0gbGFwcGx5KHBhcnMuZml0LjNwcy5sYWcsIGZ1bmN0aW9uKHgpIHNhLnR0Lm1vZEZpdC5meChtb2QgPSAiM3BzIiwgcGFycyA9IHgsIGlucHV0ID0gMSkpCgoKIyBjb21wYXJlIGxhZ2dlZCB2cy4gdW5sYWdnZWQgZml0cwpzYS50dC4ycHAuZGYgPC0gZGF0YS5mcmFtZSgKICBtb2QgPSByZXAoYygiMnBwIiwgIjJwcCwgbGFnIiksIGVhY2ggPSBsZW5ndGgoc2EudHQuMnBwLmxzKSksCiAgUE1lY29fZGVwdGggPSBjKG5hbWVzKHNhLnR0LjJwcC5scyksIG5hbWVzKHNhLnR0LjJwcC5sYWcubHMpKSwgCiAgYWdlID0gYygKICAgIHVubGlzdChsYXBwbHkobGFwcGx5KHNhLnR0LjJwcC5scywgIlsiLCAxKSwgZnVuY3Rpb24oeCkgbGFwcGx5KHgsICJbWyIsICJtZWFuU3lzdGVtQWdlIikpKSwKICAgIHVubGlzdChsYXBwbHkobGFwcGx5KHNhLnR0LjJwcC5sYWcubHMsICJbIiwgMSksIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCAiW1siLCAibWVhblN5c3RlbUFnZSIpKSkpLAogIHR0ID0gYygKICAgIHVubGlzdChsYXBwbHkobGFwcGx5KHNhLnR0LjJwcC5scywgIlsiLCAyKSwgZnVuY3Rpb24oeCkgbGFwcGx5KHgsICJbWyIsICJtZWFuVHJhbnNpdFRpbWUiKSkpLAogICAgdW5saXN0KGxhcHBseShsYXBwbHkoc2EudHQuMnBwLmxhZy5scywgIlsiLCAyKSwgZnVuY3Rpb24oeCkgbGFwcGx5KHgsICJbWyIsICJtZWFuVHJhbnNpdFRpbWUiKSkpKSkgJT4lCiAgbXV0YXRlKGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3RlcihQTWVjb19kZXB0aCksICJfIiksICJbIiwgMiksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgRUNPID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLCBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCiMgMnBzCnNhLnR0LjJwcy5kZiA8LSBkYXRhLmZyYW1lKAogIG1vZCA9IHJlcChjKCIycHMiLCAiMnBzLCBsYWciKSwgZWFjaCA9IGxlbmd0aChzYS50dC4ycHMubHMpKSwKICBQTWVjb19kZXB0aCA9IGMobmFtZXMoc2EudHQuMnBzLmxzKSwgbmFtZXMoc2EudHQuMnBzLmxhZy5scykpLCAKICBhZ2UgPSBjKAogICAgdW5saXN0KGxhcHBseShsYXBwbHkoc2EudHQuMnBzLmxzLCAiWyIsIDEpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5TeXN0ZW1BZ2UiKSkpLAogICAgdW5saXN0KGxhcHBseShsYXBwbHkoc2EudHQuMnBzLmxhZy5scywgIlsiLCAxKSwgZnVuY3Rpb24oeCkgbGFwcGx5KHgsICJbWyIsICJtZWFuU3lzdGVtQWdlIikpKSksCiAgdHQgPSBjKAogICAgdW5saXN0KGxhcHBseShsYXBwbHkoc2EudHQuMnBzLmxzLCAiWyIsIDIpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5UcmFuc2l0VGltZSIpKSksCiAgICB1bmxpc3QobGFwcGx5KGxhcHBseShzYS50dC4ycHMubGFnLmxzLCAiWyIsIDIpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5UcmFuc2l0VGltZSIpKSkpKSAlPiUKICBtdXRhdGUoZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKFBNZWNvX2RlcHRoKSwgIl8iKSwgIlsiLCAyKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBFQ08gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLCBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKQoKCiMgM3AKIyMgcHAKIyBzYS50dC4zcHAuZGYgPC0gZGF0YS5mcmFtZSgKIyAgIG1vZCA9IHJlcChjKCIzcHAiLCAiM3BwLCBsYWciKSwgZWFjaCA9IGxlbmd0aChzYS50dC4zcHAubHMpKSwKIyAgIFBNZWNvX2RlcHRoID0gYyhuYW1lcyhzYS50dC4zcHAubHMpLCBuYW1lcyhzYS50dC4zcHAubGFnLmxzKSksIAojICAgYWdlID0gYygKIyAgICAgdW5saXN0KGxhcHBseShsYXBwbHkoc2EudHQuM3BwLmxzLCAiWyIsIDEpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5TeXN0ZW1BZ2UiKSkpLAojICAgICB1bmxpc3QobGFwcGx5KGxhcHBseShzYS50dC4zcHAubGFnLmxzLCAiWyIsIDEpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5TeXN0ZW1BZ2UiKSkpKSwKIyAgIHR0ID0gYygKIyAgICAgdW5saXN0KGxhcHBseShsYXBwbHkoc2EudHQuM3BwLmxzLCAiWyIsIDIpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5UcmFuc2l0VGltZSIpKSksCiMgICAgIHVubGlzdChsYXBwbHkobGFwcGx5KHNhLnR0LjNwcC5sYWcubHMsICJbIiwgMiksIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCAiW1siLCAibWVhblRyYW5zaXRUaW1lIikpKSkpICU+JQojICAgbXV0YXRlKGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3RlcihQTWVjb19kZXB0aCksICJfIiksICJbIiwgMiksCiMgICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAojICAgICAgICAgIEVDTyA9IHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksCiMgICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLCBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiMgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAojICAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpCiMgCiMgIyMgcHMKIyBzYS50dC4zcHMuZGYgPC0gZGF0YS5mcmFtZSgKIyAgIG1vZCA9IHJlcChjKCIzcHMiLCAiM3BzLCBsYWciKSwgZWFjaCA9IGxlbmd0aChzYS50dC4zcHMubHMpKSwKIyAgIFBNZWNvX2RlcHRoID0gYyhuYW1lcyhzYS50dC4zcHMubHMpLCBuYW1lcyhzYS50dC4zcHMubGFnLmxzKSksIAojICAgYWdlID0gYygKIyAgICAgdW5saXN0KGxhcHBseShsYXBwbHkoc2EudHQuM3BzLmxzLCAiWyIsIDEpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5TeXN0ZW1BZ2UiKSkpLAojICAgICB1bmxpc3QobGFwcGx5KGxhcHBseShzYS50dC4zcHMubGFnLmxzLCAiWyIsIDEpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5TeXN0ZW1BZ2UiKSkpKSwKIyAgIHR0ID0gYygKIyAgICAgdW5saXN0KGxhcHBseShsYXBwbHkoc2EudHQuM3BzLmxzLCAiWyIsIDIpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5UcmFuc2l0VGltZSIpKSksCiMgICAgIHVubGlzdChsYXBwbHkobGFwcGx5KHNhLnR0LjNwcy5sYWcubHMsICJbIiwgMiksIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCAiW1siLCAibWVhblRyYW5zaXRUaW1lIikpKSkpICU+JQojICAgbXV0YXRlKGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KGFzLmNoYXJhY3RlcihQTWVjb19kZXB0aCksICJfIiksICJbIiwgMiksCiMgICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAojICAgICAgICAgIEVDTyA9IHN1YnN0cihQTWVjb19kZXB0aCwgMywgNCksCiMgICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLCBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiMgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAojICAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpCgojIG1ha2UgZGYgb2YgU0EgZm9yIDJwcCwgMnBzCnNhLnR0LjJwLmRmIDwtIGRhdGEuZnJhbWUoCiAgbW9kID0gcmVwKGMoIjJwcCIsICIycHMiKSwgZWFjaCA9IGxlbmd0aChzYS50dC4ycHAubHMpKSwKICBQTWVjb19kZXB0aCA9IGMobmFtZXMoc2EudHQuMnBwLmxzKSwgbmFtZXMoc2EudHQuMnBzLmxzKSksIAogIGFnZSA9IGMoCiAgICB1bmxpc3QobGFwcGx5KGxhcHBseShzYS50dC4ycHAubHMsICJbIiwgMSksIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCAiW1siLCAibWVhblN5c3RlbUFnZSIpKSksCiAgICB1bmxpc3QobGFwcGx5KGxhcHBseShzYS50dC4ycHMubHMsICJbIiwgMSksIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCAiW1siLCAibWVhblN5c3RlbUFnZSIpKSkpLAogIHR0ID0gYygKICAgIHVubGlzdChsYXBwbHkobGFwcGx5KHNhLnR0LjJwcC5scywgIlsiLCAyKSwgZnVuY3Rpb24oeCkgbGFwcGx5KHgsICJbWyIsICJtZWFuVHJhbnNpdFRpbWUiKSkpLAogICAgdW5saXN0KGxhcHBseShsYXBwbHkoc2EudHQuMnBzLmxzLCAiWyIsIDIpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5UcmFuc2l0VGltZSIpKSkpKSAlPiUKICBtdXRhdGUoZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKFBNZWNvX2RlcHRoKSwgIl8iKSwgIlsiLCAyKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBFQ08gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLCBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKQoKIyBtYWtlIGRmIG9mIFNBLCBUVCBmb3IgMnBwLCAycHMgKHcvIGxhZ3MpCnNhLnR0LjJwLmxhZy5kZiA8LSBkYXRhLmZyYW1lKAogIG1vZCA9IHJlcChjKCIycHAsIGxhZyIsICIycHMsIGxhZyIpLCBlYWNoID0gbGVuZ3RoKHNhLnR0LjJwcC5sYWcubHMpKSwKICBQTWVjb19kZXB0aCA9IGMobmFtZXMoc2EudHQuMnBwLmxhZy5scyksIG5hbWVzKHNhLnR0LjJwcy5sYWcubHMpKSwgCiAgYWdlID0gYygKICAgIHVubGlzdChsYXBwbHkobGFwcGx5KHNhLnR0LjJwcC5sYWcubHMsICJbIiwgMSksIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCAiW1siLCAibWVhblN5c3RlbUFnZSIpKSksCiAgICB1bmxpc3QobGFwcGx5KGxhcHBseShzYS50dC4ycHMubGFnLmxzLCAiWyIsIDEpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5TeXN0ZW1BZ2UiKSkpKSwKICB0dCA9IGMoCiAgICB1bmxpc3QobGFwcGx5KGxhcHBseShzYS50dC4ycHAubGFnLmxzLCAiWyIsIDIpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5UcmFuc2l0VGltZSIpKSksCiAgICB1bmxpc3QobGFwcGx5KGxhcHBseShzYS50dC4ycHMubGFnLmxzLCAiWyIsIDIpLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgIltbIiwgIm1lYW5UcmFuc2l0VGltZSIpKSkpKSAlPiUKICBtdXRhdGUoZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKFBNZWNvX2RlcHRoKSwgIl8iKSwgIlsiLCAyKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBFQ08gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLCBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKQpgYGAKCmBgYHtyIHBsb3QtU0EtVFQsIGV2YWwgPSBGQUxTRX0KIyBwbG90IGFnZXMKIyMgMnBwIHZzIDJwcwpzYS5wbG90LjJwcC4ycHMgPC0gc2EudHQuMnAuZGYgJT4lCiAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhwbSwgYWdlLCBmaWxsID0gcG0sIGFscGhhID0gbW9kKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gIk1vZGVsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiMnBwIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjJwcyIgPSAuNSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoZWNvKSwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2d0aXRsZSgiTWVhbiBzeXN0ZW0gYWdlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIyAycHAgdnMuIDJwcCBsYWcKc2EucGxvdC4ycHAgPC0gc2EudHQuMnBwLmRmICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiQlN3Zl8yMC0zMCIpICU+JSAKICBnZ3Bsb3QoLiwgYWVzKHBtLCBhZ2UsIGZpbGwgPSBwbSwgYWxwaGEgPSBtb2QpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAiTW9kZWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIycHAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMnBwLCBsYWciID0gLjUpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKGVjbyksIHNjYWxlcyA9ICJmcmVlIikgKwogIGdndGl0bGUoIk1lYW4gc3lzdGVtIGFnZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyMgMnBzIHZzLiAycHMgbGFnCnNhLnBsb3QuMnBzIDwtIHNhLnR0LjJwcy5kZiAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBtLCBhZ2UsIGZpbGwgPSBwbSwgYWxwaGEgPSBtb2QpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAiTW9kZWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIycHMiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMnBzLCBsYWciID0gLjUpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKGVjbyksIHNjYWxlcyA9ICJmcmVlIikgKwogIGdndGl0bGUoIk1lYW4gc3lzdGVtIGFnZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyMgM3BwIHZzLiAzcHAgbGFnCiMgc2EucGxvdC4zcHAgPC0gc2EudHQuM3BwLmRmICU+JQojICAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIiAmIFBNZWNvX2RlcHRoICE9ICJBTnBwXzIwLTMwIikgJT4lCiMgICBmaWx0ZXIoYWdlID4gMCkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKHBtLCBhZ2UsIGZpbGwgPSBwbSwgYWxwaGEgPSBtb2QpKSArCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKIyAgIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gIk1vZGVsIiwKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIzcHAiID0gMSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzcHAsIGxhZyIgPSAuNSkpICsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKIyAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhlY28pLCBzY2FsZXMgPSAiZnJlZSIpICsKIyAgIGdndGl0bGUoIk1lYW4gc3lzdGVtIGFnZSIpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKIyAKIyAjIyAzcHMgdnMgM3BzIGxhZwojIHNhLnBsb3QuM3BzIDwtIHNhLnR0LjNwcy5kZiAlPiUKIyAgIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiQlN3Zl8yMC0zMCIgJiBQTWVjb19kZXB0aCAhPSAiQU5wcF8yMC0zMCIpICU+JQojICAgZmlsdGVyKGFnZSA+IDApICU+JQojICAgZ2dwbG90KC4sIGFlcyhwbSwgYWdlLCBmaWxsID0gcG0sIGFscGhhID0gbW9kKSkgKwojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiMgICBzY2FsZV9hbHBoYV9tYW51YWwobmFtZSA9ICJNb2RlbCIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiM3BzIiA9IDEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiM3BzLCBsYWciID0gLjUpKSArCiMgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoZWNvKSwgc2NhbGVzID0gImZyZWUiKSArCiMgICBnZ3RpdGxlKCJNZWFuIHN5c3RlbSBhZ2UiKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgCiMgIyMgMnBwIGxhZyB2cyAzcHAgbGFnCiMgc2EucGxvdC4ycHAuM3BwLmxhZyA8LSAKIyAgIHJiaW5kKHNhLnR0LjJwLmxhZy5kZltncmVwbCgiMnBwIiwgc2EudHQuMnAubGFnLmRmJG1vZCksIF0sIAojICAgICAgICAgc2EudHQuM3BwLmRmW2dyZXBsKCJsYWciLCBzYS50dC4zcHAuZGYkbW9kKSwgXSkgJT4lCiMgICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiICYgUE1lY29fZGVwdGggIT0gIkdScHBfMjAtMzAiKSAlPiUKIyAgIGdncGxvdCguLCBhZXMocG0sIGFnZSwgZmlsbCA9IHBtLCBhbHBoYSA9IG1vZCkpICsKIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwojICAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAiTW9kZWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIjJwcCwgbGFnIiA9IDEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiM3BwLCBsYWciID0gLjUpKSArCiMgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoZWNvKSwgc2NhbGVzID0gImZyZWUiKSArCiMgICBnZ3RpdGxlKCJNZWFuIHN5c3RlbSBhZ2UiKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgCiMgIyMgMnBzIGxhZyB2cyAzcHMgbGFnCiMgc2EucGxvdC4ycHMuM3BzLmxhZyA8LSAKIyAgIHJiaW5kKHNhLnR0LjJwLmxhZy5kZltncmVwbCgiMnBzIiwgc2EudHQuMnAubGFnLmRmJG1vZCksIF0sIAojICAgICAgICAgc2EudHQuM3BzLmRmW2dyZXBsKCJsYWciLCBzYS50dC4zcHMuZGYkbW9kKSwgXSkgJT4lCiMgICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiICYgUE1lY29fZGVwdGggIT0gIkdScHBfMjAtMzAiKSAlPiUKIyAgIGdncGxvdCguLCBhZXMocG0sIGFnZSwgZmlsbCA9IHBtLCBhbHBoYSA9IG1vZCkpICsKIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwojICAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAiTW9kZWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIjJwcywgbGFnIiA9IDEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiM3BzLCBsYWciID0gLjUpKSArCiMgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoZWNvKSwgc2NhbGVzID0gImZyZWUiKSArCiMgICBnZ3RpdGxlKCJNZWFuIHN5c3RlbSBhZ2UiKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIHBsb3QgdHQgKHcvbyBsYWdzKQp0dC5wbG90LjJwcC4ycHMgPC0gc2EudHQuMnAuZGYgJT4lCiAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIikgJT4lCiAgZmlsdGVyKG1vZCA9PSAiMnBwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhwbSwgdHQsIGZpbGwgPSBwbSwgYWxwaGEgPSBtb2QpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAiTW9kZWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIycHAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMnBzIiA9IC41KSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZWNvKSwgcm93cyA9IHZhcnMoZGVwdGgpKSArCiAgZ2d0aXRsZSgiTWVhbiB0cmFuc2l0IHRpbWUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgMnBwICh3LyBsYWcpCnR0LnBsb3QuMnBwLjJwcC5sYWcgPC0gc2EudHQuMnBwLmRmICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiQlN3Zl8yMC0zMCIpICU+JQogIGdncGxvdCguLCBhZXMocG0sIHR0LCBmaWxsID0gcG0sIGFscGhhID0gbW9kKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gIk1vZGVsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiMnBwIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjJwcCwgbGFnIiA9IC41KSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZWNvKSwgcm93cyA9IHZhcnMoZGVwdGgpLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZ3RpdGxlKCJNZWFuIHRyYW5zaXQgdGltZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyAzcAojIHR0LnBsb3QuM3BwIDwtIHNhLnR0LjNwcC5kZiAlPiUKIyAgIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiQlN3Zl8yMC0zMCIgJiBQTWVjb19kZXB0aCAhPSAiQlNyZl8wLTEwIikgJT4lCiMgICBmaWx0ZXIoYWdlID4gMCkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKHBtLCB0dCwgZmlsbCA9IHBtLCBhbHBoYSA9IG1vZCkpICsKIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwojICAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAiTW9kZWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIjNwcCIgPSAxLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjNwcCwgbGFnIiA9IC41KSkgKwojICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwojICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhlY28pLCByb3dzID0gdmFycyhkZXB0aCksIHNjYWxlcyA9ICJmcmVlIikgKwojICAgZ2d0aXRsZSgiTWVhbiB0cmFuc2l0IHRpbWUiKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiMgCiMgIyAycHAgdnMuIDNwcAojIHR0LnBsb3QuMnBwLjNwcC5sYWcgPC0gcmJpbmQoCiMgICBzYS50dC4ycC5sYWcuZGZbZ3JlcGwoIjJwcCIsIHNhLnR0LjJwLmxhZy5kZiRtb2QpLCBdLCAKIyAgIHNhLnR0LjNwcC5kZltncmVwbCgibGFnIiwgc2EudHQuM3BwLmRmJG1vZCksIF0pICU+JQojICAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIiAmIFBNZWNvX2RlcHRoICE9ICJCU3JmXzAtMTAiKSAlPiUKIyAgIGZpbHRlcihhZ2UgPiAwKSAlPiUKIyAgIGdncGxvdCguLCBhZXMocG0sIHR0LCBmaWxsID0gcG0sIGFscGhhID0gbW9kKSkgKwojICAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiMgICBzY2FsZV9hbHBoYV9tYW51YWwobmFtZSA9ICJNb2RlbCIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiMnBwLCBsYWciID0gMSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzcHAsIGxhZyIgPSAuNSkpICsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKIyAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZWNvKSwgcm93cyA9IHZhcnMoZGVwdGgpLCBzY2FsZXMgPSAiZnJlZSIpICsKIyAgIGdndGl0bGUoIk1lYW4gdHJhbnNpdCB0aW1lIikgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyAycHMKdHQucGxvdC4ycHMuMnBzLmxhZyA8LSBzYS50dC4ycHMuZGYgJT4lCiAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIiAmIFBNZWNvX2RlcHRoICE9ICJHUnJmXzIwLTMwIiAmIFBNZWNvX2RlcHRoICE9ICJHUnJmXzEwLTIwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhwbSwgdHQsIGZpbGwgPSBwbSwgYWxwaGEgPSBtb2QpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAiTW9kZWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIycHMiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMnBzLCBsYWciID0gLjUpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhlY28pLCByb3dzID0gdmFycyhkZXB0aCksIHNjYWxlcyA9ICJmcmVlIikgKwogIGdndGl0bGUoIk1lYW4gdHJhbnNpdCB0aW1lIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGNvbXBhcmUgbGFnZ2VkIGZpdHMKdHQucGxvdC4ycC5sYWcgPC0gc2EudHQuMnAubGFnLmRmICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiR1JyZl8xMC0yMCIgJiBQTWVjb19kZXB0aCAhPSAiR1JyZl8yMC0zMCIpICU+JQogIGdncGxvdCguLCBhZXMocG0sIHR0LCBmaWxsID0gcG0sIGFscGhhID0gbW9kKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gIk1vZGVsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiMnBwLCBsYWciID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMnBzLCBsYWciID0gLjUpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhlY28pLCByb3dzID0gdmFycyhkZXB0aCkpICsKICBnZ3RpdGxlKCJNZWFuIHRyYW5zaXQgdGltZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKc2EucGxvdC4ycHMKdHQucGxvdC4ycHMuMnBzLmxhZwoKIyBzYS5wbG90LjNwcAojIHNhLnBsb3QuM3BzCmBgYAoKYGBge3IgcGxvdC1zYS10dCwgZXZhbCA9IEZBTFNFfQojIyBjb21wYXJpc29uIG9mIHNhLCB0dCwgYW1vbmcgMnBwIGFuZCAycHMgbW9kcwojIHNhLnBsb3QuMnAubGFnCiMgdHQucGxvdC4ycC5sYWcKCiMjIyAycHMgbW9kcywgY29tcGFyaXNvbiBvZiBjbGltYXRlIGVmZmVjdCB3aXRoaW4gUE0KIyMgMC0xMAojIFNBCnNhLnBsb3QuMnBzLjEwIDwtIHNhLnR0LjJwcy5kZiAlPiUKICBmaWx0ZXIobW9kID09ICIycHMsIGxhZyIgJiBkZXB0aCA9PSAiMC0xMCIpICU+JQogIGdncGxvdCguLCBhZXMoZWNvLCBhZ2UsIGZpbGwgPSBlY28pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICIiLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IHdhcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSBjb29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gY29sZCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA1NTApKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhwbSksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2d0aXRsZSgiTWVhbiBzeXN0ZW0gYWdlIikgKwogIHlsYWIoIk1lYW4gYWdlICh5KSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJ3aGl0ZSIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvRGVza3RvcC9zYS5wbG90LjJwcy4xMC5wbmciLCBwbG90ID0gc2EucGxvdC4ycHMuMTAsCiAgICAgICB3aWR0aCA9IDguNDksIGhlaWdodCA9IDQuMTcsIHVuaXRzID0gYygiaW4iKSkKIyBUVAp0dC5wbG90LjJwcy4xMCA8LSBzYS50dC4ycHMuZGYgJT4lCiAgZmlsdGVyKG1vZCA9PSAiMnBzLCBsYWciICYgZGVwdGggPT0gIjAtMTAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGVjbywgdHQsIGZpbGwgPSBlY28pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYSA9IC44KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygid2FybSIgPSB3YXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gY29vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IGNvbGQpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMjIwKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMocG0pLCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdndGl0bGUoIk1lYW4gdHJhbnNpdCB0aW1lIikgKwogIHlsYWIoIk1lYW4gdHJhbnNpdCB0aW1lICh5KSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJ3aGl0ZSIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvRGVza3RvcC90dC5wbG90LjJwcy4xMC5wbmciLCBwbG90ID0gdHQucGxvdC4ycHMuMTAsCiAgICAgICB3aWR0aCA9IDguNDksIGhlaWdodCA9IDQuMTcsIHVuaXRzID0gYygiaW4iKSkKCiMjIDEwLTIwCiMgU0EKc2EucGxvdC4ycHMuMjAgPC0gc2EudHQuMnBzLmRmICU+JQogIGZpbHRlcihtb2QgPT0gIjJwcywgbGFnIiAmIGRlcHRoID09ICIxMC0yMCIpICU+JQogIGdncGxvdCguLCBhZXMoZWNvLCBhZ2UsIGZpbGwgPSBlY28pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygid2FybSIgPSB3YXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gY29vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IGNvbGQpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhwbSksIHNjYWxlcyA9ICJmcmVlIikgKwogIGdndGl0bGUoIk1lYW4gc3lzdGVtIGFnZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBUVAp0dC5wbG90LjJwcy4yMCA8LSBzYS50dC4ycHMuZGYgJT4lCiAgZmlsdGVyKG1vZCA9PSAiMnBzLCBsYWciICYgZGVwdGggPT0gIjEwLTIwIiAmIFBNZWNvX2RlcHRoICE9ICJHUnJmXzEwLTIwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhlY28sIHR0LCBmaWxsID0gZWNvKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIndhcm0iID0gd2FybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IGNvb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSBjb2xkKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMocG0pLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZ3RpdGxlKCJNZWFuIHRyYW5zaXQgdGltZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyMgYWxsIGRlcHRocwojIFNBCnNhLnBsb3QuMnBwLjJwcy5sYWcgPC0gc2EudHQuMnAubGFnLmRmICU+JQogIGZpbHRlcihtb2QgPT0gIjJwcywgbGFnIiAmIFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhlY28sIGFnZSwgZmlsbCA9IGVjbykpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIiIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gd2FybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IGNvb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSBjb2xkKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhwbSksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2d0aXRsZSgiTWVhbiBzeXN0ZW0gYWdlIikgKwogIHlsYWIoIk1lYW4gYWdlICh5KSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkKIyBnZ3NhdmUoIi9Vc2Vycy9qZWZmL0Rlc2t0b3Avc2EucGxvdC4ycHMubGFnLnBuZyIsIHBsb3QgPSBzYS5wbG90LjJwcC4ycHMubGFnLAojICAgICAgICB3aWR0aCA9IDcsIGhlaWdodCA9IDQuMTcsIHVuaXRzID0gYygiaW4iKSkKCiMgcGxvdCBCU3JmIGFzIGFuIGV4YW1wbGUgb2YgbGFnIGVmZmVjdHMgKHcvIGRlcHRoKQpsZyA8LSBnZXRfbGVnZW5kKHBsb3QubHMuMnBzLmxhZ1tbMTNdXSArIAogICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikpCnAubHMgPC0gbGFwcGx5KHBsb3QubHMuMnBzLmxhZ1sxMzoxNV0sIGZ1bmN0aW9uKHApIHsKICBwICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgIHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKfSkKeS5ncm9iIDwtIHRleHRHcm9iKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSwKICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250ZmFjZSA9ICJib2xkIiwgZm9udHNpemUgPSAxNCksIHJvdCA9IDkwKQp4Lmdyb2IgPC0gdGV4dEdyb2IoIlllYXIiLCBncCA9IGdwYXIoZm9udGZhY2UgPSAiYm9sZCIsIGZvbnRzaXplID0gMTQpKQpsYWJzIDwtIHBhc3RlMChsZXR0ZXJzWzE6M10sICIpIiwgYygiIDAtMTAgY20iLCAiIDEwLTIwIGNtIiwgIiAyMC0zMCBjbSIpKQpwZyA8LSBhcnJhbmdlR3JvYigKICBwbG90X2dyaWQocGxvdGxpc3QgPSBwLmxzLCBuY29sID0gMSwgbGFiZWxzID0gbGFicywgbGFiZWxfeCA9IC4wOCwgaGp1c3QgPSAwLCBsYWJlbF95ID0gLjk1LCBsYWJlbF9zaXplID0gMTAsIGxhYmVsX2ZvbnRmYWNlID0gImJvbGQiKSwKICBsZWZ0ID0geS5ncm9iLCBib3R0b20gPSB4Lmdyb2IpCkJTcmYuMnBzLnAgPC0gcGxvdF9ncmlkKHBnLCBsZywgcmVsX3dpZHRocyA9IGMoNCwgMSkpCiMgZ2dzYXZlKCIvVXNlcnMvamVmZi9EZXNrdG9wL0JTcmYuMnBzLnAucG5nIiwgcGxvdCA9IEJTcmYuMnBzLnAsCiMgICAgICAgIHdpZHRoID0gNiwgaGVpZ2h0ID0gNC4xNywgdW5pdHMgPSBjKCJpbiIpKQpCU3JmLjJwcy5wCmBgYAoKYGBge3IgcGxvdC1zYS10dC1kaXN0LW1vZEZpdCwgZXZhbD1GQUxTRX0KIyBkZW5zaXR5IGV4dHJhY3Rpb24gZngKc2EuZGVucy5kZi5meCA8LSBmdW5jdGlvbihzYS5scykgewogIGxzIDwtIGxhcHBseShzYS5scywgZnVuY3Rpb24oeCkgeFtbMV1dW1sic3lzdGVtQWdlRGVuc2l0eSJdXSkKICBhcnIgPC0gYmluZF9jb2xzKGxzKQogIGRmIDwtIGRhdGEuZnJhbWUoUE1lY29fZGVwdGggPSByZXAoZGltbmFtZXMoYXJyKVtbMl1dLCBlYWNoID0gbnJvdyhhcnIpKSwKICAgICAgICAgICAgICAgICAgIGFnZXMgPSByZXAoc2VxKDEsIG5yb3coYXJyKSksIG5jb2woYXJyKSksCiAgICAgICAgICAgICAgICAgICBkZW5zID0gdW5saXN0KGxzKSkKICBkZiAlPiUKICAgIG11dGF0ZShwbSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjb19kZXB0aCksICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvX2RlcHRoKSwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoIndmIiwgUE1lY29fZGVwdGgpLCAiY29vbCIsICJjb2xkIiksIGxldmVscyA9IGMoImNvb2wiLCAiY29sZCIpKSkKfQoKCnNhLmRlbnMuZGYgPC0gc2EuZGVucy5kZi5meChzYS50dC4ycHAuaW1wcnMubHMpCmZfbGFicyA8LSBkYXRhLmZyYW1lKGFnZXMgPSAyMjAsIGRlbnMgPSAwLjAxNCwgZWNvID0gYygiY29vbCIsICJjb2xkIikpCmZfbGFicyRsYWJlbCA8LSBwYXN0ZTAobGV0dGVyc1sxOjJdLCAiKSAiLCBmX2xhYnMkZWNvKQpzYS5wIDwtIGdncGxvdChzYS5kZW5zLmRmLCBhZXMoYWdlcywgZGVucykpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gcG0pLCBzaXplID0gMS4yKSArCiAgZ2VvbV92bGluZShkYXRhID0gc2EuMnBwLmltcHJzLmRmLCBhZXMoeGludGVyY2VwdCA9IGFnZSwgY29sb3IgPSBwbSksCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fdGV4dChkYXRhID0gZl9sYWJzLCBhZXMobGFiZWwgPSBsYWJlbCksCiAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAuMzYgKiAyOCwgZm9udGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gImxlZnQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICIiLAogICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDAsIDE1MCwgMzAwLCA0NTApKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhlY28pKSArCiAgeGxhYigiQWdlIikgKwogIHlsYWIoIkRlbnNpdHkiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMS43LCAiY20iKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKZ2dzYXZlKGZpbGVuYW1lID0gIi9Vc2Vycy9qZWZmL25leHRDbG91ZC9Eb2N1bWVudHMvUG9zdGVycyBhbmQgdGFsa3MvTXkgcG9zdGVyczp0YWxrcy9JTVBSU19SZXRyZWF0XzIwMjIvc2EucG5nIiwKICAgICAgIHBsb3QgPSBzYS5wLCBoZWlnaHQgPSA1LjY0LCB3aWR0aCA9IDEzLCB1bml0cyA9ICJpbiIpCnNhLnAKYGBgCgpgYGB7ciBsbS1TQS1UVH0KIyBQTSBlZmZlY3RzLCAwLTEwIGNtCnNhLnR0LjJwLmRmICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiQU5wcF8wLTEwIikgJT4lCiAgZmlsdGVyKGRlcHRoID09ICIwLTEwIikgJT4lCiAgbG0oYWdlIH4gcG0sIC4pICU+JQogIHN1bW1hcnkKCiMgbGFnZ2VkIHNpdGVzCnNhLnR0LjJwLmxhZy5kZiAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkdScmZfMTAtMjAiICYgUE1lY29fZGVwdGggIT0gIkdScmZfMjAtMzAiICYgUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiKSAlPiUKICBtdXRhdGUobWlkZGVwdGggPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aCwgIi0iKSwgIltbIiwgMikpIC0gNSkgJT4lCiAgbG0oYWdlIH4gcG0gKiBlY28gKyBtaWRkZXB0aCwgLikgJT4lCiAgc3VtbWFyeQoKIyBNQVQKbWF0LmRmIDwtIGRhdGEuZnJhbWUoCiAgUE1lY28gPSBjKCJBTnBwIiwgIkJTcHAiLCAiR1JwcCIsICJBTndmIiwgIkJTd2YiLCAiR1J3ZiIsICJBTnJmIiwgIkJTcmYiLCAiR1JyZiIpLAogIE1BVCA9IGMoMTEuNSwgMTMuMywgMTEuMSwgOC41LCA4LjMsIDkuMSwgNiwgNi41LCA3LjIpKQoKc2EudHQuMnAubGFnLmRmICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiR1JyZl8xMC0yMCIgJiBQTWVjb19kZXB0aCAhPSAiR1JyZl8yMC0zMCIgJiBQTWVjb19kZXB0aCAhPSAiQlN3Zl8yMC0zMCIpICU+JQogIG11dGF0ZShtaWRkZXB0aCA9IGFzLm51bWVyaWMoc2FwcGx5KHN0cnNwbGl0KGRlcHRoLCAiLSIpLCAiW1siLCAyKSkgLSA1LAogICAgICAgICBQTWVjbyA9IHNhcHBseShzdHJzcGxpdChhcy5jaGFyYWN0ZXIoUE1lY29fZGVwdGgpLCAiXyIpLCAiW1siLCAxKSkgJT4lCiAgbGVmdF9qb2luKG1hdC5kZikgJT4lCiAgbG0odHQgfiBwbSAqIE1BVCArIG1pZGRlcHRoLCAuKSAlPiUKICBzdW1tYXJ5CmBgYAoKIyMgQWdlcyAmIHRyYW5zaXQgdGltZXMKCkZpdHMgZm9yIHRoZSAycHAgYW5kIDJwcyBtb2RlbHMgd2VyZSBzaW1pbGFyIGFjcm9zcyB0aGUgMC0xMCBjbSBkZXB0aCBsYXllci4gVGhlIG9ubHkgbm90aWNhYmxlIGV4Y2VwdGlvbnMgd2VyZSBmb3IgdGhlIEdSd2YgYW5kIEdScmYgc2l0ZXMuIEZvciB0aGUgR1JyZiBzaXRlLCB0aGUgZml0IGZvciB0aGUgMnBwIG1vZGVsIHdhcyBlc3NlbnRpYWxseSBhIG9uZSBwb29sIG1vZGVsLCB3aXRoIG5lYXJseSBpZGVudGljYWwgKnRhdSogdmFsdWVzIG9mIDEvMTcwIGZvciB0aGUgZmFzdCBhbmQgc2xvdyBwb29scy4gSW4gY29udHJhc3QsICp0YXUqIGZvciB0aGUgZmFzdCBwb29sIGluIHRoZSAycHMgbW9kZWwgZml0IGF0IHRoZSBHUnJmIHNpdGUgd2FzIDEsIHdoaWxlIHRoZSBzbG93IHBvb2wgdGF1IHdhcyAxLzE3MC4gRm9yIHRoZSBHUndmIHNpdGUsIHRoZSAycHAgZml0IGhhZCB0YXUgdmFsdWVzIG9mIDIxIGFuZCAxNTIgZm9yIGZhc3QgYW5kIHNsb3cgcG9vbHMsIHJlc3BlY3RpdmVseSwgd2hpbGUgdGhlIDJwcyB0YXVzIHdlcmUgc21hbGxlciAobG9uZ2VyIHR1cm5vdmVyIHRpbWUpOiA1NyBhbmQgMTA3NSByZXNwZWN0aXZlbHkuCgpJbiBnZW5lcmFsLCBkdWUgdG8gdGhlIHNpbWlsYXJpdGllcyBpbiB0aGUgZml0cyBhbmQgdGhlIGRpZmZlcmVuY2VzIGluIG1vZGVsIHN0cnVjdHVyZSwgdGhlIGFnZXMgYW5kIHRyYW5zaXQgdGltZXMgd2VyZSBzdWJzdGFudGlhbGx5IGxvbmdlciBmb3IgdGhlIHNlcmllcyBtb2RlbHMgdGhhbiBmb3IgdGhlIHBhcmFsbGVsIG1vZGVscy4gSG93ZXZlciwgbWVhbiBhZ2VzIGFuZCB0cmFuc2l0IHRpbWVzIGZvciBib3RoIHRoZSAycHAgYW5kIDJwcyBmaXRzIGFwcGVhcmVkIHRvIGJlIGV4Y2Vzc2l2ZWx5IGxvbmcgYXQgc2V2ZXJhbCBvZiB0aGUgc2l0ZXMuIFRoaXMgcHJvYmxlbSB3YXMgZXNwZWNpYWxseSBhcHBhcmVudCBmb3IgdGhlIDEwLTIwIGNtIGFuZCAyMC0zMCBjbSBkZXB0aCBsYXllcnMsIGFsdGhvdWdoIHdlIGFsc28gb2JzZXJ2ZWQgYWdlcyBmb3IgdGhlIEFOcHAgc2l0ZSBpbiB0aGUgMC0xMCBjbSBkZXB0aCBsYXllciB0aGF0IGV4Y2VlZGVkIHRob3NlIG9mIHRoZSBvdGhlciBzaXRlcyBieSBhbiBvcmRlciBvZiBtYWduaXR1ZGUgKGNhLiAxNTAwIHZzLiAxNTApLiBGb3IgdGhlIDEwLTIwIGNtIGxheWVyLCB0aGUgY29sZCBjbGltYXRlIGdyYW5pdGUgc2l0ZSBoYWQgdGhlIG9sZGVzdCBtZWFuIGFnZXM6IDE3NTAgYW5kIDI1MDAgZm9yIHRoZSAycHAgYW5kIDJwcyBtb2RlbHMgcmVzcGVjdGl2ZWx5LCB3aXRoIHRoZSBtZWFuIGFnZSBvZiB0aGUgcmVtYWluaW5nIHNpdGVzID0gMzUwIHlycy4gVGhlIG1vc3Qgc3RyaWtpbmcgb3V0bGllciBmb3IgYWdlIHdhcyB0aGUgMjAtMzAgY20gbGF5ZXIgYXQgdGhlIEJTd2Ygc2l0ZSwgZm9yIHdoaWNoIGJvdGggdGhlIDJwcCBhbmQgMnBzIG1vZGVscyBoYWQgbWVhbiBhZ2VzIOKJpSA5NSwwMDAsIGV4Y2VlZGluZyB0aGUgbWVhbiBhZ2VzIG9mIHRoZSBvdGhlciBzaXRlcyBieSAxIHRvIDIgb3JkZXJzIG9mIG1hZ25pdHVkZS4KCiMgQmF5ZXNpYW4gZml0cwoKYGBge3IgZXh0cmFjdC1iYXllcy1maXRzfQojIGxvYWQgZml0cyBhcyBuZWVkZWQKaWYgKCFleGlzdHMoImJheWVzX2ZpdF8xcC5sYWciKSkgewogIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9iYXllcy1wYXItZml0LTIwMjItMTEtMjMvYmF5ZXNfZml0XzFwLmxhZ18xMDAwaXRlci5SRGF0YSIpfQppZiAoIWV4aXN0cygiYmF5ZXNfZml0XzJwcCIpKSB7CiAgbG9hZCgiLi4vZGF0YS9kZXJpdmVkL2JheWVzLXBhci1maXQtMjAyMi0xMS0xNy9iYXllc19maXRfMnBwXzEwMDBpdGVyLlJEYXRhIil9CmlmICghZXhpc3RzKCJiYXllc19maXRfMnBzIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9iYXllcy1wYXItZml0LTIwMjItMTEtMTcvYmF5ZXNfZml0XzJwc18xMDAwaXRlci5SRGF0YSIpCn0KaWYgKCFleGlzdHMoImJheWVzX2ZpdF8ycHAubGFnIikpIHsKICBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvYmF5ZXMtcGFyLWZpdC0yMDIyLTExLTI5L2JheWVzX2ZpdF8ycHAubGFnXzEwMDAwaXRlci5SRGF0YSIpCn0KaWYgKCFleGlzdHMoImJheWVzX2ZpdF8ycHMubGFnIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9iYXllcy1wYXItZml0LTIwMjItMTItMDEvYmF5ZXNfZml0XzJwcy5sYWdfMTAwMDBpdGVyLlJEYXRhIikKfQoKIyBtYXRjaCByb3dzCiMgd2hpY2goYXBwbHkoYmF5ZXNfZml0XzJwcC5sYWckYEFOcHBfMC0xMGAkcGFycywgMSwgZnVuY3Rpb24oeCkgYWxsKHggPT0gYmF5ZXNfZml0XzJwcC5sYWckYEFOcHBfMC0xMGAkYmVzdHBhcikpKQoKIyBsb2FkUkRhdGEgPC0gZnVuY3Rpb24oZmlsZU5hbWUpewojICNsb2FkcyBhbiBSRGF0YSBmaWxlLCBhbmQgcmV0dXJucyBpdAojICAgICBsb2FkKGZpbGVOYW1lKQojICAgICBnZXQobHMoKVtscygpICE9ICJmaWxlTmFtZSJdKQojIH0KIyAKIyBiYXllc19maXRfMnBwLmxhZy4xMDAwIDwtIGxvYWRSRGF0YSgiLi4vZGF0YS9kZXJpdmVkL2JheWVzLXBhci1maXQtMjAyMi0xMS0xNy9iYXllc19maXRfMnBwLmxhZ18xMDAwaXRlci5SRGF0YSIpCgojIHBhcnMKcGFycy5maXQuMXAubGFnLm1jbWMgPC0gbGFwcGx5KGJheWVzX2ZpdF8xcC5sYWcsICJbWyIsICJiZXN0cGFyIikKcGFycy5maXQuMnBwLm1jbWMgPC0gbGFwcGx5KGJheWVzX2ZpdF8ycHAsICJbWyIsICJiZXN0cGFyIikKcGFycy5maXQuMnBzLm1jbWMgPC0gbGFwcGx5KGJheWVzX2ZpdF8ycHMsICJbWyIsICJiZXN0cGFyIikKcGFycy5maXQuMnBwLmxhZy5tY21jIDwtIGxhcHBseShiYXllc19maXRfMnBwLmxhZywgIltbIiwgImJlc3RwYXIiKQpwYXJzLmZpdC4ycHMubGFnLm1jbWMgPC0gbGFwcGx5KGJheWVzX2ZpdF8ycHMubGFnLCAiW1siLCAiYmVzdHBhciIpCgojIG1vZGZpdHMKbW9kLmZpdHRlZC4xcC5sYWcubWNtYyA8LSBsYXBwbHkoYmF5ZXNfZml0XzFwLmxhZywgZnVuY3Rpb24oeCkgCiAgICBtb2RGdW4oeCRiZXN0cGFyLCAiMXAiLCAxLCBvdXQgPSAiIiwgdmVyYm9zZSA9IEZBTFNFLCBmaXRfbGFnID0gVFJVRSkpCm1vZC5maXR0ZWQuMnBwLm1jbWMgPC0gbGFwcGx5KGJheWVzX2ZpdF8ycHAsIGZ1bmN0aW9uKHgpIAogICAgbW9kRnVuKHgkYmVzdHBhciwgIjJwcCIsIDEsIG91dCA9ICIiLCB2ZXJib3NlID0gRkFMU0UpKQptb2QuZml0dGVkLjJwcy5tY21jIDwtIGxhcHBseShiYXllc19maXRfMnBzLCBmdW5jdGlvbih4KSAKICAgIG1vZEZ1bih4JGJlc3RwYXIsICIycHMiLCAxLCBvdXQgPSAiIiwgdmVyYm9zZSA9IEZBTFNFKSkKbW9kLmZpdHRlZC4ycHAubGFnLm1jbWMgPC0gbGFwcGx5KGJheWVzX2ZpdF8ycHAubGFnLCBmdW5jdGlvbih4KSAKICAgIG1vZEZ1bih4JGJlc3RwYXIsICIycHAiLCAxLCBvdXQgPSAiIiwgdmVyYm9zZSA9IEZBTFNFLCBmaXRfbGFnID0gVFJVRSkpCm1vZC5maXR0ZWQuMnBzLmxhZy5tY21jIDwtIGxhcHBseShiYXllc19maXRfMnBzLmxhZywgZnVuY3Rpb24oeCkgCiAgICBtb2RGdW4oeCRiZXN0cGFyLCAiMnBzIiwgMSwgb3V0ID0gIiIsIHZlcmJvc2UgPSBGQUxTRSwgZml0X2xhZyA9IFRSVUUpKQoKIyBBSUMgZnggZm9yIG1vZE1DTUMgW21heWJlIHRoaXMgd29ya3M/XQphaWMuYmljLk1DTUMgPC0gZnVuY3Rpb24obWNtYy5scywgbW9kLmZpdC5scywgc3RhdCA9ICJBSUNfcnNzIiwgLi4uKSB7CiAgbm1zIDwtIG5hbWVzKG1jbWMubHMpCiAgbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhtY21jLmxzKSwgZnVuY3Rpb24oaSkgewogICAgbWNtYyA8LSBtY21jLmxzW1tpXV0KICAgIG5wYXIgPC0gbGVuZ3RoKG1jbWMkYmVzdHBhcikKICAgIG4gPC0gbGVuZ3RoKG1vZC5maXQubHNbW2ldXVtbInJlc2lkdWFscyJdXSkKICAgIFNTIDwtIG1pbihtY21jJFNTLCBuYS5ybSA9IFRSVUUpICMgZm9yIHNvbWUgcmVhc29uIG5vdCBhbHdheXMgYmVzdHBhci4uLgogICAgbXMgPC0gU1MgLyBuCiAgICBBSUMgPC0gLTIgKiBsb2cobXMpICsgMiAqIG5wYXIgCiAgICBpZiAoc3RhdCA9PSAiQUlDIikgewogICAgICBBSUMKICAgIH0gZWxzZSBpZiAoc3RhdCA9PSAiQklDIikgewogICAgICAyICogbG9nKG1zKSArIG5wYXIgKiBsb2cobikKICAgIH0gZWxzZSBpZiAoc3RhdCA9PSAiQUlDYyIpIHsKICAgICAgQUlDICsgKDIgKiBucGFyICogKG5wYXIgKyAxKSkgLyAobiAtIG5wYXIgLSAxKQogICAgfSBlbHNlIGlmIChzdGF0ID09ICJBSUNfcnNzIikgewogICAgICBBSUMgPC0gMiAqIG5wYXIgKyBuICogbG9nKG1zKSAKICAgIH0KICB9KQogIG5hbWVzKGxzKSA8LSBubXMKICByZXR1cm4obHMpCn0KCiMgQ2FsYyBBSUMKYWljLjFwLmxhZy5tY21jIDwtIGFpYy5iaWMuTUNNQyhiYXllc19maXRfMXAubGFnLCBtb2QuZml0cy4xcC5sYWcpCmFpYy4ycHAubWNtYyA8LSBhaWMuYmljLk1DTUMoYmF5ZXNfZml0XzJwcCwgbW9kLmZpdHMuMnBwKQpiaWMuMnBwLm1jbWMgPC0gYWljLmJpYy5NQ01DKHN0YXQgPSAiQklDIiwgYmF5ZXNfZml0XzJwcCwgbW9kLmZpdHMuMnBwKQphaWMuMnBzLm1jbWMgPC0gYWljLmJpYy5NQ01DKGJheWVzX2ZpdF8ycHMsIG1vZC5maXRzLjJwcykKYWljLjJwcC5sYWcubWNtYyA8LSBhaWMuYmljLk1DTUMoYmF5ZXNfZml0XzJwcC5sYWcsIG1vZC5maXRzLjJwcC5sYWcpCmJpYy4ycHAubGFnLm1jbWMgPC0gYWljLmJpYy5NQ01DKHN0YXQgPSAiQklDIiwgYmF5ZXNfZml0XzJwcC5sYWcsIG1vZC5maXRzLjJwcCkKYWljLjJwcy5sYWcubWNtYyA8LSBhaWMuYmljLk1DTUMoYmF5ZXNfZml0XzJwcy5sYWcsIG1vZC5maXRzLjJwcy5sYWcpCgojIHN1bW1hcml6ZQphaWMuZGYgPC0gZGF0YS5mcmFtZShtYXBwbHkodW5saXN0LCBsaXN0KAogIGFpYy4ycHAubWNtYywKICBhaWMuMnBzLm1jbWMsCiAgYWljLjJwcC5sYWcubWNtYywKICBhaWMuMnBzLmxhZy5tY21jCikpKQphaWMuZGYkUE1lY29fZGVwdGggPC0gcm93bmFtZXMoYWljLmRmKQphaWMuZGYkUE1lY28gPC0gc2FwcGx5KHN0cnNwbGl0KGFpYy5kZiRQTWVjb19kZXB0aCwgIl8iKSwgIltbIiwgMSkKYWljLmRmJGRlcHRoIDwtIHNhcHBseShzdHJzcGxpdChhaWMuZGYkUE1lY29fZGVwdGgsICJfIiksICJbWyIsIDIpCm5hbWVzKGFpYy5kZilbMTo0XSA8LSBjKCJUd29wcCIsICJUd29wcyIsICJUd29wcC5sYWciLCAiVHdvcHMubGFnIikKCiMgY2FsY3VsYXRlIEFJQ19taW4gYW5kIEFJQ19pCmFpYy5kZiRBSUNtaW4gPC0gYXBwbHkoYWljLmRmWyAsIDE6NF0sIDEsIG1pbikKbWluLml4IDwtIHdoaWNoKGFpYy5kZlsgLCAxOjRdID09IGFpYy5kZiRBSUNtaW4sIGFyci5pbmQgPSBUUlVFKQphaWMuZGYkQUlDbWluX25tIDwtIG5hbWVzKGFpYy5kZilbMTo0XVttaW4uaXhbb3JkZXIobWluLml4WywgMV0pLCAyXV0KCmFpYy5pLmRmIDwtIGRhdGEuZnJhbWUoCiAgbW9kID0gcmVwKGMoIlR3b3BwIiwgIlR3b3BwLmxhZyIsICJUd29wcyIsICJUd29wcy5sYWciKSwgZWEgPSAyNyksCiAgUE1lY29fZGVwdGggPSBuYW1lcyhhaWMuMnBwLm1jbWMpLAogIGFpYyA9IGMobWFwcGx5KHVubGlzdCwgbGlzdCgKICAgIGFpYy4ycHAubWNtYywgYWljLjJwcy5tY21jLCBhaWMuMnBwLmxhZy5tY21jLCBhaWMuMnBzLmxhZy5tY21jKSkpKSAKYWljLmkubHMgPC0gbGFwcGx5KHNwbGl0KGFpYy5pLmRmLCBhaWMuaS5kZiRQTWVjb19kZXB0aCksIGZ1bmN0aW9uKHgpIHsKICBBSUNfbWluIDwtIG1pbih4JGFpYykKICB4JGRlbHRhX2FpYyA8LSBhYnMoeCRhaWMgLSBBSUNfbWluKQogIHhbd2hpY2gocm91bmQoeCRkZWx0YV9haWMsIDApIDw9IDIpLCBdCn0pCgphaWMuaS5sYWcuZGYgPC0gZGF0YS5mcmFtZSgKICBtb2QgPSByZXAoYygiMXAubGFnIiwgIjJwcC5sYWciLCAiMnBzLmxhZyIpLCBlYSA9IDI3KSwKICBQTWVjb19kZXB0aCA9IG5hbWVzKGFpYy4ycHAubGFnLm1jbWMpLAogIGFpYyA9IGMoCiAgICBtYXBwbHkodW5saXN0LCBsaXN0KGFpYy4xcC5sYWcubWNtYywgYWljLjJwcC5sYWcubWNtYywgYWljLjJwcy5sYWcubWNtYykpKSkKYWljLmkubGFnLmxzIDwtIGxhcHBseSgKICBzcGxpdChhaWMuaS5sYWcuZGYsIGFpYy5pLmxhZy5kZiRQTWVjb19kZXB0aCksIGZ1bmN0aW9uKHgpIHsKICBBSUNfbWluIDwtIG1pbih4JGFpYykKICB4JGRlbHRhX2FpYyA8LSBhYnMoeCRhaWMgLSBBSUNfbWluKQogIHhbd2hpY2gocm91bmQoeCRkZWx0YV9haWMsIDApIDw9IDIpLCBdCn0pCmFpYy5pLmxhZy5iZXN0LmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoCiAgc3BsaXQoYWljLmkubGFnLmRmLCBhaWMuaS5sYWcuZGYkUE1lY29fZGVwdGgpLCBmdW5jdGlvbih4KSB7CiAgQUlDX21pbiA8LSBtaW4oeCRhaWMpCiAgeCRkZWx0YV9haWMgPC0gYWJzKHgkYWljIC0gQUlDX21pbikKICB4W3gkZGVsdGFfYWljID09IDAsIF0KfSkpCmBgYAoKTUNNQyBjaGFpbnMgZm9yIG1vc3Qgb2YgdGhlIHBhcmFtZXRlcnMsIGFjcm9zcyBhbGwgb2YgdGhlIG1vZGVsIHN0cnVjdHVyZXMsIGZhaWwgdG8gY29udmVyZ2UgYWZ0ZXIgMTAwMCBpdGVyYXRpb25zLiBTaG91bGQgdHJ5IDUwMDAgaXRyIGZvciBhIHN1YnNldCwgZXZhbHVhdGUgaW1wcm92ZW1lbnQsIGFuZCBjb25zaWRlciBvcHRpbWFsIG51bWJlciBvZiBpdGVyYXRpb25zLiAKCkNhbiBhbHNvIGNvbnNpZGVyIHVzaW5nIHNtYWxsZXIgdXBkYXRlY292IHZhbHVlIChjdXJyZW50bHkgc2V0IGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucykgZHVyaW5nIHRoZSBidXJuaW4gcGVyaW9kIHRvIGhhcm5lc3MgdGhlIHBvd2VyIG9mIHRoZSBhZGFwdGl2ZSBNZXRyb3BvbGlzIG1ldGhvZC4gRGVsYXllZCByZWplY3Rpb24gYWxnb3JpdGhtIGlzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkgZ2l2ZW4gdGhlIGdlbmVyYWxseSBoaWdoIGxldmVsIG9mIGFjY2VwdGVkIHJ1bnMgKG1vc3QgPjkwJSkuCgpgYGB7ciBwbG90LW1jbWMtZHJpZnQsIGV2YWwgPSBGQUxTRX0KIyBtb3N0IE1DTUMgY2hhaW5zIGhhdmUgbm90IGNvbnZlcmdlZCBhZnRlciAxMDAwIGl0cgpsYXBwbHkoYmF5ZXNfZml0XzFwLmxhZywgZnVuY3Rpb24oeCkgcGxvdCh4KSkKbGFwcGx5KGJheWVzX2ZpdF8ycHAubGFnLCBmdW5jdGlvbih4KSBwbG90KHgpKQpsYXBwbHkoYmF5ZXNfZml0XzJwcy5sYWcsIGZ1bmN0aW9uKHgpIHBsb3QoeCkpCmBgYAoKIyMgTUNNQyBBSUMKCkNvbXBhcmlzb24gb2YgQUlDIHZhbHVlcyBiZXR3ZWVuIG1vZEZpdCBwYXJhbWV0ZXIgc2V0cyBhbmQgTUNNQyBzZXRzIGluZGljYXRlIGEgY2xlYXIgcGVyZm9ybWFuY2UgaW5jcmVhc2UgZm9yIHRoZSBNQ01DIHBhcmFtZXRlcnMuIEhvd2V2ZXIsIHdoZW4gY29tcGFyaW5nIHJlbGF0aXZlIEFJQyB2YWx1ZXMgYW1vbmcgdGhlIE1DTUMgcGFyYW1ldGVyIHNldHMgZml0IGZvciBwYXJhbGxlbCBhbmQgc2VyaWVzIG1vZGVsIHN0cnVjdHVyZXMsIGFuZCB0aGUgc3RydWN0dXJlcyB3aXRoIG9yIHdpdGhvdXQgbGFncyBhcmUgZXNzZW50aWFsbHkgaW5kaXN0aW5ndWlzaGFibGUuIFRoZSBkaWZmZXJlbmNlIGluIEFJQyB2YWx1ZXMsIGkuZS4gJFxEZWx0YSRBSUMsIGlzIHdpdGhpbiAyIGZvciBhbGwgb2YgdGhlIHNpdGVzLCBpbmRpY2F0aW5nIGEgaGlnaCBsZXZlbCBvZiBzdXBwb3J0IGZvciBlaXRoZXIgbW9kZWwgc3RydWN0dXJlIGFuZCBlaXRoZXIgcGFyYW1ldGVyIHNldC4gSW5wdXQgY2FsY3VsYXRpb25zIGFyZSBhbHNvIHNpbWlsYXIgYWNyb3NzIG1vZGVsIHN0cnVjdHVyZXMsIGFsdGhvdWdoIG1vcmUgb2YgdGhlIHR3byBwb29sIHNlcmllcyBtb2RlbCBmaXRzIHlpZWxkIHVucmVhbGlzdGljYWxseSBoaWdoIChvciBsb3cpIGlucHV0cy4KCmBgYHtyIGJheWVzLWFpYywgZXZhbCA9IEZBTFNFfQojIHBsb3QKaWMuZGYgPC0gZGF0YS5mcmFtZShwbSA9IHN1YnN0cihuYW1lcyhhaWMuMnBwLm1jbWMpLCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICBlY28gPSBzdWJzdHIobmFtZXMoYWljLjJwcC5tY21jKSwgMywgNCksIAogICAgICAgICAgICAgICAgICAgIGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KG5hbWVzKGFpYy4ycHAubWNtYyksICJfIiksICJbWyIsIDIpKQojIyAycHAKIyMjIEFJQwpjYmluZChpYy5kZiwKICAgICAgbW9kID0gcmVwKGMoIjJwcCIsICIycHAsIGxhZyIpLCBlYSA9IGxlbmd0aChhaWMuMnBwLm1jbWMpKSwgCiAgICAgIGFpYyA9IGModW5saXN0KGFpYy4ycHAubWNtYyksIHVubGlzdChhaWMuMnBwLmxhZy5tY21jKSkpICU+JSAKICBnZ3Bsb3QoLiwgYWVzKHBtLCBhaWMsIGZpbGwgPSBtb2QpKSArIAogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyAKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoZWNvKSkgKyB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIyMgQklDCmNiaW5kKGljLmRmLAogICAgICBtb2QgPSByZXAoYygiMnBwIiwgIjJwcCwgbGFnIiksIGVhID0gbGVuZ3RoKGJpYy4ycHAubWNtYykpLAogICAgICBiaWMgPSBjKHVubGlzdChiaWMuMnBwLm1jbWMpLCB1bmxpc3QoYmljLjJwcC5sYWcubWNtYykpKSAlPiUgCiAgZ2dwbG90KC4sIGFlcyhwbSwgYmljLCBmaWxsID0gbW9kKSkgKyAKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsgCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKGVjbykpICsgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMjIDJwcwpjYmluZChpYy5kZiwKICAgICAgbW9kID0gcmVwKGMoIjJwcyIsICIycHMsIGxhZyIpLCBlYSA9IGxlbmd0aChhaWMuMnBwLm1jbWMpKSwgCiAgICAgIGFpYyA9IGModW5saXN0KGFpYy4ycHMubWNtYyksIHVubGlzdChhaWMuMnBzLmxhZy5tY21jKSkpICU+JSAKICBnZ3Bsb3QoLiwgYWVzKHBtLCBhaWMsIGZpbGwgPSBtb2QpKSArIAogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyAKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoZWNvKSkgKyB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyMKY2JpbmQoaWMuZGYsCiAgICAgIG1vZCA9IHJlcChjKCIycHAsIG1vZEZpdCIsICIycHAsIE1DTUMiKSwgZWEgPSBsZW5ndGgoYWljLjJwcC5tY21jKSksCiAgICAgIGFpYy5kaWYgPSBjKHVubGlzdChhaWMuMnBwKSAtIHVubGlzdChhaWMuMnBwLm1jbWMpKSkgJT4lIAogIGdncGxvdCguLCBhZXMocG0sIGFpYy5kaWYsIGZpbGwgPSBhaWMuZGlmKSkgKyAKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIoKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKGVjbykpICsgdGhlbWVfYncoKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJyZWQgPSAycHAsIG1vZEZpdDsgYmx1ZSA9IDJwcCwgTUNNQyIpICsKICB5bGFiKCJBSUMgZGlmICgxcCwgbGFnIC0gMnBzKSIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKY2JpbmQoaWMuZGYsCiAgICAgIG1vZCA9IHJlcChjKCIycHAiLCAiMnBwLCBsYWciKSwgZWEgPSBsZW5ndGgoYWljLjJwcC5tY21jKSksCiAgICAgIGFpYy5kaWYgPSBjKHVubGlzdChhaWMuMnBwLm1jbWMpIC0gdW5saXN0KGFpYy4ycHAubGFnLm1jbWMpKSkgJT4lIAogIGdncGxvdCguLCBhZXMocG0sIGFpYy5kaWYsIGZpbGwgPSBhaWMuZGlmKSkgKyAKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIoKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKGVjbykpICsgdGhlbWVfYncoKSArCiAgbGFicyhzdWJ0aXRsZSA9ICJyZWQgPSAycHA7IGJsdWUgPSAycHAsIGxhZyIpICsKICB5bGFiKCJBSUMgZGlmICgxcCwgbGFnIC0gMnBzKSIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKY2JpbmQoaWMuZGYsCiAgICAgIG1vZCA9IHJlcChjKCIxcCwgbGFnIiwgIjJwcCIpLCBlYSA9IGxlbmd0aChhaWMuMnBwLm1jbWMpKSwKICAgICAgYWljLmRpZiA9IGModW5saXN0KGFpYy4xcC5sYWcpIC0gdW5saXN0KGFpYy4ycHAubWNtYykpKSAlPiUgCiAgZ2dwbG90KC4sIGFlcyhwbSwgYWljLmRpZiwgZmlsbCA9IGFpYy5kaWYpKSArIAogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50MigpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoZWNvKSkgKyB0aGVtZV9idygpICsKICBsYWJzKHN1YnRpdGxlID0gInJlZCA9IDFwLCBsYWc7IGJsdWUgPSAycHAiKSArCiAgeWxhYigiQUlDIGRpZiAoMXAsIGxhZyAtIDJwcykiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgMnBwIHZzIDJwcyAKY2JpbmQoaWMuZGYsCiAgICAgIG1vZCA9IHJlcChjKCIycHAiLCAiMnBzIiksIGVhID0gbGVuZ3RoKGFpYy4ycHAubWNtYykpLAogICAgICBhaWMuZGlmID0gYyh1bmxpc3QoYWljLjJwcC5tY21jKSAtIHVubGlzdChhaWMuMnBzLm1jbWMpKSkgJT4lCiAgbXV0YXRlKFBNZWNvX2RlcHRoID0gcGFzdGUwKHBtLCBlY28sICJfIiwgZGVwdGgpKSAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkdScmZfMTAtMjAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBtLCBhaWMuZGlmLCBmaWxsID0gYWljLmRpZikpICsgCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKCkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhlY28pKSArIHRoZW1lX2J3KCkgKwogIGxhYnMoc3VidGl0bGUgPSAicmVkID0gMnBwOyBibHVlID0gMnBzIikgKwogIHlsYWIoIkFJQyBkaWYgKDJwcCAtIDJwcykiKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBhaWMtcHJvYnN9CiMgY2FsY3VsYXRlIHByb2JhYmlsaXR5IHRoYXQgQUlDIGlzIG1lYW5pbmdmdWxseSBkaWZmZXJlbnQKIyBQID0gZV4oKEFJQ19taW4gLSBBSUNfaSkvMikKIyBzZXQgYWxwaGEgdG8gZGlzdGluZ3Vpc2ggd2hpY2ggbW9kZWxzIGFyZSAqcHJvYmFibHkqIGJldHRlcgpleHAoKGFpYy4ycHAkYEFOd2ZfMC0xMGAgLSBhaWMuMnBwLmxhZyRgQU5wcF8wLTEwYCkgLyAyKQpgYGAKCmBgYHtyIHBsb3QtYmF5ZXMtZml0c30KIyBjb21wYXJlIG1vZEZpdCBhbmQgYmF5ZXMgZml0IGZvciAycHAsIDJwcyAoMC0xMGNtKQpwbG90Lm1jbWMubW9kZml0LjJwcCA8LSBtdWx0aU1vZC5maXQucGxvdC5meCgKICBtb2QuZml0dGVkLjJwcCwgIjJwcCwgbW9kRml0IiwKICBtb2QuZml0dGVkLjJwcC5tY21jLCAiMnBwLCBNQ01DIikKcGxvdC5tY21jLm1vZGZpdC4ycHMgPC0gbXVsdGlNb2QuZml0LnBsb3QuZngoCiAgbW9kLmZpdHRlZC4ycHMsICIycHMsIG1vZEZpdCIsCiAgbW9kLmZpdHRlZC4ycHMubWNtYywgIjJwcywgTUNNQyIpCnBsb3QubWNtYy4ycHAuMnBzIDwtIG11bHRpTW9kLmZpdC5wbG90LmZ4KAogIG1vZC5maXR0ZWQuMnBwLm1jbWMsICIycHAsIE1DTUMiLAogIG1vZC5maXR0ZWQuMnBzLm1jbWMsICIycHMsIE1DTUMiKQoKcGxvdC5tY21jLjJwcC4ycHMubGFnIDwtIG11bHRpTW9kLmZpdC5wbG90LmZ4KAogIG1vZC5maXR0ZWQuMnBwLmxhZy5tY21jLCAiMnBwIGxhZywgTUNNQyIsCiAgbW9kLmZpdHRlZC4ycHMubGFnLm1jbWMsICIycHMgbGFnLCBNQ01DIikKCnBsb3QubWNtYy4xcC5sYWcubWNtYy5tb2RGaXQgPC0gbXVsdGlNb2QuZml0LnBsb3QuZngoCiAgbW9kLmZpdHRlZC4xcC5sYWcsICIxcCBsYWcsIG1vZEZpdCIsCiAgbW9kLmZpdHRlZC4xcC5sYWcubWNtYywgIjFwIGxhZywgTUNNQyIpCgojIGxvb2sgYXQgcGFyYW1ldGVyIGNvbGxpbmVhcml0eQpjb2xsLjJwcCA8LSBsYXBwbHkoYmF5ZXNfZml0XzJwcCwgcGFpcnMpCmNvbGwuMnBzIDwtIGxhcHBseShiYXllc19maXRfMnBzLCBwYWlycykKCm11bHRpTW9kLmZpdC5wbG90LmZ4KAogIG1vZC5maXR0ZWQuMXAubGFnLm1jbWMsICIxcC5sYWcsIE1DTUMiLAogIG1vZC5maXR0ZWQuMnBwLmxhZy5tY21jLCAiMnBwLmxhZywgTUNNQyIsCiAgbW9kLmZpdHRlZC4ycHMubGFnLm1jbWMsICIycHMubGFnLCBtb2RGaXQiKQpgYGAKCmBgYHtyIHBsb3QtcGFycy1meH0KcGxvdC5wYXJzLmZ4IDwtIGZ1bmN0aW9uKHBhcnMubHMsIHhfdmFyLCBtb2QsIGxhZyA9IEZBTFNFLCBwYXJfZmlsdGVyID0gTlVMTCkgewogIAogICMgcXVvdGUgeF92YXIKICBxdW9fdmFyIDwtIHN5bSh4X3ZhcikKICAKICAjIHNldCBncm91cCB2YXIKICBpZiAoeF92YXIgPT0gImVjbyIpIHsKICAgIHF1b19maWwgPC0gc3ltKCJwbSIpCiAgICBxdW9fdmxzIDwtIGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLCAiYmFzYWx0IiA9IGJhc2FsdCwgImdyYW5pdGUiID0gZ3Jhbml0ZSkKICB9IGVsc2UgewogICAgcXVvX2ZpbCA8LSBzeW0oImVjbyIpCiAgICBxdW9fdmxzIDwtIGMoIndhcm0iID0gd2FybSwgImNvb2wiID0gY29vbCwgImNvbGQiID0gY29sZCkKICB9CiAgCiAgIyBkZWZpbmUgcGFyIG5hbWVzCiAgaWYgKGdyZXBsKCIxcCIsIG1vZCkpIHsKICAgIHBhcl9uYW1lcyA8LSAiayIKICB9IGVsc2UgaWYgKGdyZXBsKCIycCIsIG1vZCkpIHsKICAgIHBhcl9uYW1lcyA8LSBjKCJrX2Zhc3QiLCAia19zbG93IikgCiAgfSBlbHNlIHsKICAgIHBhcl9uYW1lcyA8LSBjKCJrX2Zhc3QiLCAia19zbG93IiwgImtfcGFzc2l2ZSIpIAogIH0KICAKICAjIHN0cmlwIG91dCBsYWcKICBpZiAobGFnKSB7CiAgICBwYXJfbHMgPC0gbGFwcGx5KHBhcl9scywgZnVuY3Rpb24oeCkgeFsxOihsZW5ndGgoeCkgLSAxKV0pCiAgfQogIAogICMgZmlsdGVyIHBhcnMKICBpZiAoIWlzLm51bGwocGFyX2ZpbHRlcikpIHsKICAgIHBhcnMubHMgPC0gbGFwcGx5KHBhcnMubHMsIGZ1bmN0aW9uKHgpIHggPC0geFstcGFyX2ZpbHRlcl0pCiAgfQogIGlmIChncmVwbCgicHMiLCBtb2QpKSB7CiAgICBwYXJfbmFtZXMgPC0gZmFjdG9yKGMocGFyX25hbWVzLCAiYWxwaGEiKSwgbGV2ZWxzID0gYyhwYXJfbmFtZXMsICJhbHBoYSIpKQogIH0gZWxzZSB7CiAgICBwYXJfbmFtZXMgPC0gZmFjdG9yKGMocGFyX25hbWVzLCAiZ2FtbWEiKSwgbGV2ZWxzID0gYyhwYXJfbmFtZXMsICJnYW1tYSIpKQogIH0KICAKICBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmxzKSwgZnVuY3Rpb24oaSkgewogICAgZGF0YS5mcmFtZSh2YWx1ZSA9IHBhcnMubHNbW2ldXSwKICAgICAgICAgICAgICAgcGFyID0gcGFyX25hbWVzLAogICAgICAgICAgICAgICBQTSA9IHN1YnN0cihuYW1lcyhwYXJzLmxzKVtpXSwgMSwgMiksCiAgICAgICAgICAgICAgIEVDTyA9IHN1YnN0cihuYW1lcyhwYXJzLmxzKVtpXSwgMywgNCkpCiAgfSkpICU+JQogIG11dGF0ZShlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLCBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKCEhIHF1b192YXIsIHZhbHVlLCBmaWxsID0gISEgcXVvX2ZpbCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBxdW9fdmxzKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhwYXIpLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKfQpgYGAKCmBgYHtyIHBsb3QtcGFycywgZXZhbCA9IEZBTFNFfQojIHBsb3QgbW9kRml0IHBhcnMKcGxvdC5wYXJzLmZ4KHBhcnMuZml0LjJwcCwgImVjbyIsICIycHAiKQpwbG90LnBhcnMuZngocGFycy5maXQuMnBzLCAiZWNvIiwgIjJwcyIpCgojIHBsb3QgbW9kRml0IHBhcnMsIDNwCnBsb3QucGFycy5meChwYXJzLmZpdC4zcHAubGFnLCAiZWNvIiwgIjNwcCwgbGFnIikKcGxvdC5wYXJzLmZ4KHBhcnMuZml0LjNwcy5sYWcsICJlY28iLCAiM3BzLCBsYWciKQoKIyBwbG90IE1DTUMgcGFycwpwbG90LnBhcnMuZngocGFycy5maXQuMnBwLm1jbWMsICJlY28iLCAiMnBwIikKcGxvdC5wYXJzLmZ4KHBhcnMuZml0LjJwcy5tY21jLCAiZWNvIiwgIjJwcyIpCiMgdy8gbGFnCnBsb3QucGFycy5meChwYXJzLmZpdC4ycHAubGFnLm1jbWMsICJlY28iLCAiMnBwIikKcGxvdC5wYXJzLmZ4KHBhcnMuZml0LjJwcy5sYWcubWNtYywgImVjbyIsICIycHMiKQpgYGAKCmBgYHtyIHBsb3QtYmF5ZXMtcGFycywgZXZhbCA9IEZBTFNFfQojIyBsb29rIGF0IG1vZGVsIHBlcmZvcm1hbmNlCnBhcnMuYmF5ZXMuZGYuZnggPC0gZnVuY3Rpb24obW9kLCBwYXJzLmJheWVzLCBwYXJzLmZpdCkgewogIGJpbmRfcm93cyhsYXBwbHkoc2VxX2Fsb25nKHBhcnMuYmF5ZXMpLCBmdW5jdGlvbihpKSB7CiAgICBpeCA8LSBtYXRjaCh1bmlxdWUocGFycy5iYXllc1tbaV1dW1sicGFycyJdXVssIDFdKSwgcGFycy5iYXllc1tbaV1dW1sicGFycyJdXVssIDFdKQogICAgZGYgPC0gZGF0YS5mcmFtZShrMSA9IHBhcnMuYmF5ZXNbW2ldXVtbInBhcnMiXV1baXgsIDFdLAogICAgICAgICAgICAgICAgICAgICBrMiA9IHBhcnMuYmF5ZXNbW2ldXVtbInBhcnMiXV1baXgsIDJdLAogICAgICAgICAgICAgICAgICAgICBwMyA9IHBhcnMuYmF5ZXNbW2ldXVtbInBhcnMiXV1baXgsIDNdKQogICAgZGYgPC0gY2JpbmQoZGYsCiAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IHJlcChuYW1lcyhwYXJzLmZpdClbaV0sIGxlbmd0aChpeCkpLAogICAgICAgICAgICAgICAgbW9kID0gcmVwKG1vZCwgbGVuZ3RoKGl4KSkpCiAgICBkZiA8LSBjYmluZChkZiwgCiAgICAgICAgICAgICAgICBQTSA9IGZhY3RvcihzdWJzdHIoZGYkUE1lY29fZGVwdGgsIDEsIDIpKSwKICAgICAgICAgICAgICAgIGVjbyA9IGZhY3RvcihzdWJzdHIoZGYkUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkKICAgIHJldHVybihkZikKICB9KSkKfQpwYXJzLmJheWVzLjJwcC5kZiA8LSBwYXJzLmJheWVzLmRmLmZ4KCIycHAiLCBiYXllc19maXRfMnBwXzBfMTAsIHBhcnMuZml0LjJwcFtpeC4xMF0pCnBhcnMuYmF5ZXMuMnBzLmRmIDwtIHBhcnMuYmF5ZXMuZGYuZngoIjJwcyIsIGJheWVzX2ZpdF8ycHNfMF8xMCwgcGFycy5maXQuMnBzW2l4LjEwXSkKCiMgY29tYmluZQpwYXJzLmJheWVzLjJwLmRmIDwtIHJiaW5kKHBhcnMuYmF5ZXMuMnBwLmRmLAogICAgICBwYXJzLmJheWVzLjJwcy5kZikgJT4lCiAgbXV0YXRlKG1vZCA9IGMocmVwKCIycHAiLCBucm93KHBhcnMuYmF5ZXMuMnBwLmRmKSksIHJlcCgiMnBzIiwgbnJvdyhwYXJzLmJheWVzLjJwcy5kZikpKSwKICAgICAgICAgUE1lY28gPSBhcy5jaGFyYWN0ZXIoc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCA0KSkpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gMTozLCBuYW1lc190byA9ICJwYXIiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICBtdXRhdGUoUE0gPSBmYWN0b3IoUE0pLAogICAgICAgICBlY28gPSBmYWN0b3IoZWNvLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpLCBsYWJlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSkKICAKIyBwbG90CnBhcnMuYmF5ZXMuMnAuZGYgJT4lCiAgZmlsdGVyKHBhciAhPSAicDMiKSAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkdScmZfMC0xMCIpICU+JQogIGdncGxvdCguLCBhZXMoUE0sIHZhbHVlLCBjb2xvciA9IFBNLCBsaW5ldHlwZSA9IG1vZCkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZWNvKSwgcm93cyA9IHZhcnMocGFyKSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyBNQ01DIElucHV0cwoKUmVzdWx0cyBmcm9tIHRoZSBpbnB1dHMgc3VnZ2VzdCB0aGF0IHNvbWUgb2YgdGhlIHBhcmFtZXRlciBzZXRzIGFyZSBzaW1wbHkgbm90IHJlYWxpc3RpYy4gVGhlIHF1ZXN0aW9uIHJlbWFpbnMgYXMgdG8gd2hldGhlciBvciBub3QgdGhlIHJlbWFpbmluZyBpbnB1dHMgYXJlIHJlYWxpc3RpYy4gCgpUaGVyZSBpcyBubyBkaXNjZXJuYWJsZSB0cmVuZCB3aXRoIGNsaW1hdGUsIGJ1dCB0aGVyZSBkb2VzIGFwcGVhciB0byBiZSBhIHRyZW5kIHdpdGggZGVwdGguIFN1cnByaXNpbmdseSwgcGVyaGFwcywgdGhlIDAtMTAgY20gZGVwdGggZG9lcyBub3QgZGl2ZXJnZSBzdWJzdGFudGlhbGx5IGZyb20gdGhlIDEwLTIwIGNtIGRlcHRoIChJIHdvdWxkIGV4cGVjdCB0aGUgc3VyZmFjZSBpbnB1dHMgdG8gYmUgc3Vic3RhbnRpYWxseSBoaWdoZXIsIHByaW1hcmlseSBkdWUgdG8gcm9vdCBkZW5zaXR5KS4gCgpGdXJ0aGVybW9yZSwgdGhlIGFuZGVzaXRpYyBzb2lscyBhcHBlYXIgdG8gaGF2ZSBoaWdoZXIgaW5wdXRzIHRoYW4gdGhlIG90aGVyIHNvaWxzLiBUaGlzIGNvdWxkIGJlIHRydWUsIGJ1dCBJIGRvbid0IGtub3cgaWYgSSBiZWxpZXZlIGl0LiBJIHdvbmRlciBpZiB0aGVyZSBpcyBhIHdheSB0byBkZW1vbnN0cmF0ZSBwYXJlbnQgbWF0ZXJpYWwgZWZmZWN0cyBvbiBHUFAsIGUuZy4gYXMgYSBmdW5jdGlvbiBvZiBudXRyaWVudCBzdGF0dXM/IExpa2VseSBHUFAtYmFzZWQgZXN0aW1hdGVzIHdvdWxkIGJlIHN1ZmZpY2llbnQsIGFzIEkgd291bGRuJ3QgZXhwZWN0IHBhcnRpdGlvbmluZyBiZXR3ZWVuIGFib3ZlIGFuZCBiZWxvd2dyb3VuZCBpbnB1dHMgdG8gYmUgYWZmZWN0ZWQgYnkgcGFyZW50IG1hdGVyaWFsLiBDcmFpZyBoYXMgbWVudGlvbmVkIHRoYXQgaWYgdGhlcmUgd2VyZSB0byBiZSBhbnkgaW1wYWN0cyBvZiBwYXJlbnQgbWF0ZXJpYWwgb24gZmVydGlsaXR5LCBhbmQgYnkgZXh0ZW5zaW9uIG9uIGJlbG93Z3JvdW5kIGlucHV0cywgdGhlIGJhc2FsdCBzb2lscyB3b3VsZCBsaWtlbHkgYmUgdGhlIG1vc3QgZmVydGlsZSBkdWUgdG8gaW5oZXJpdGVkIHBob3NwaG9ydXMuIAoKYGBge3IgbWNtYy1pbn0KaWYgKCFleGlzdHMoIlNBLlRULjFwLmxhZy5scyIpKSB7CiBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvYmF5ZXMtcGFyLWZpdC0yMDIyLTEyLTA4L2JheWVzX2ZpdF9TQV9UVF8xcC5sYWdfMTAwMDBpdGVyLlJEYXRhIikgCn0KaWYgKCFleGlzdHMoIlNBLlRULjJwcC5sYWcubHMiKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL2JheWVzLXBhci1maXQtMjAyMi0xMi0xMS9iYXllc19maXRfU0FfVFRfMnBwLmxhZ18xMDAwMGl0ZXIuUkRhdGEiKSAKfQppZiAoIWV4aXN0cygiU0EuVFQuMnBzLmxhZy5scyIpKSB7CiBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvYmF5ZXMtcGFyLWZpdC0yMDIyLTEyLTAyL2JheWVzX2ZpdF9TQV9UVF8ycHMubGFnXzEwMDAwaXRlci5SRGF0YSIpIAp9CgojIyAxcCwgdy8gbGFnCmluLmZpdC4xcC5sYWcubWNtYyA8LSBpbi5maXQuZngocGFycy5maXQuMXAubGFnLm1jbWMsICIxcCIsIGluLjEubHMpCmluLmZpdC4xcC5sYWcubWNtYy5lcnIgPC0gbGFwcGx5KHNlcV9hbG9uZyhTQS5UVC4xcC5sYWcubHMpLCBmdW5jdGlvbihpKSB7CiAgc3lzQWdlIDwtIFNBLlRULjFwLmxhZy5sc1tbaV1dW1sic3lzQWdlIl1dCiAgc3RvY2sgPC0gY3NvYy4xOS4wXzMwW1tpXV1bWyJseXJfc29jIl1dCiAgaW5zIDwtIHVubGlzdChsYXBwbHkoc3lzQWdlLCBmdW5jdGlvbih4KSBzdG9jayAvIHgpKQogIGRhdGEuZnJhbWUoaW5fbWVhbiA9IG1lYW4oaW5zKSwgaW5fc2QgPSBzZChpbnMpKQp9KQpuYW1lcyhpbi5maXQuMXAubGFnLm1jbWMuZXJyKSA8LSBuYW1lcyhTQS5UVC4xcC5sYWcubHMpCgojIyAycAojIyMgcHAKaW4uZml0LjJwcC5tY21jIDwtIGluLmZpdC5meChwYXJzLmZpdC4ycHAubWNtYywgIjJwcCIsIGluLjEubHMpCmluLmZpdC4ycHAubGFnLm1jbWMgPC0gaW4uZml0LmZ4KHBhcnMuZml0LjJwcC5sYWcubWNtYywgIjJwcCIsIGluLjEubHMpCmluLmZpdC4ycHAubGFnLm1jbWMuZXJyIDwtIGxhcHBseSgKICBsYXBwbHkoU0EuVFQuMnBwLmxhZy5scywgIltbIiwgImlucyIpLCBmdW5jdGlvbih4KSB7CiAgICBkYXRhLmZyYW1lKGluX21lYW4gPSBtZWFuKHVubGlzdCh4KSksIGluX3NkID0gc2QodW5saXN0KHgpKSkKICB9KQoKIyMgcHMKaW4uZml0LjJwcy5tY21jIDwtIGluLmZpdC5meChwYXJzLmZpdC4ycHMubWNtYywgIjJwcyIsIGluLjEubHMpCmluLmZpdC4ycHMubGFnLm1jbWMgPC0gaW4uZml0LmZ4KHBhcnMuZml0LjJwcy5sYWcubWNtYywgIjJwcyIsIGluLjEubHMpCmluLmZpdC4ycHMubGFnLm1jbWMuZXJyIDwtIGxhcHBseSgKICBsYXBwbHkoU0EuVFQuMnBzLmxhZy5scywgIltbIiwgImlucyIpLCBmdW5jdGlvbih4KSB7CiAgICBkYXRhLmZyYW1lKGluX21lYW4gPSBtZWFuKHVubGlzdCh4KSksIGluX3NkID0gc2QodW5saXN0KHgpKSkKICB9KQoKIyBtYWtlIHBsb3QgbGlzdCBpbnRvIGRmCmluLnBsb3QuZGYuZnggPC0gZnVuY3Rpb24oaW4ubHMsIG1vZCkgewogIGJpbmRfcm93cygKICBsYXBwbHkoaW4ubHMsIGZ1bmN0aW9uKHgpIGRhdGEuZnJhbWUoSW4gPSB4KSksIAogIC5pZCA9ICJQTWVjb19kZXB0aCIpICU+JSAKICBtdXRhdGUobW9kID0gbW9kKSAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBFQ08gPSBmYWN0b3IoCiAgICAgICAgICAgc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSwKICAgICAgICAgICBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpLCBsYWJlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZGVwdGggPSBzdWJzdHIoUE1lY29fZGVwdGgsIDYsIG5jaGFyKFBNZWNvX2RlcHRoKSkpCn0KCiMgMnAKaW4uZml0LjFwLmxhZy5tY21jLmRmIDwtIGluLnBsb3QuZGYuZngoaW4uZml0LjFwLmxhZy5tY21jLCAiMXAubGFnIikKaW4uZml0LjFwLmxhZy5tY21jLmVyci5kZiA8LSBiaW5kX3Jvd3MoaW4uZml0LjFwLmxhZy5tY21jLmVyciwgLmlkID0gIlBNZWNvX2RlcHRoIikgJT4lCiAgbXV0YXRlKG1vZCA9ICIxcC5sYWciLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIEVDTyA9IGZhY3RvcigKICAgICAgICAgICBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLAogICAgICAgICAgIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIiksIGxhYmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkZXB0aCA9IHN1YnN0cihQTWVjb19kZXB0aCwgNiwgbmNoYXIoUE1lY29fZGVwdGgpKSkKaW4uZml0LjJwcC5tY21jLmRmIDwtIGluLnBsb3QuZGYuZngoaW4uZml0LjJwcC5tY21jLCAiMnBwIikKaW4uZml0LjJwcC5sYWcubWNtYy5kZiA8LSBpbi5wbG90LmRmLmZ4KGluLmZpdC4ycHAubGFnLm1jbWMsICIycHAubGFnIikKaW4uZml0LjJwcC5sYWcubWNtYy5lcnIuZGYgPC0gYmluZF9yb3dzKGluLmZpdC4ycHAubGFnLm1jbWMuZXJyLCAuaWQgPSAiUE1lY29fZGVwdGgiKSAlPiUKICBtdXRhdGUobW9kID0gIjJwcC5sYWciLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIEVDTyA9IGZhY3RvcigKICAgICAgICAgICBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLAogICAgICAgICAgIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIiksIGxhYmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkZXB0aCA9IHN1YnN0cihQTWVjb19kZXB0aCwgNiwgbmNoYXIoUE1lY29fZGVwdGgpKSkKaW4uZml0LjJwcy5tY21jLmRmIDwtIGluLnBsb3QuZGYuZngoaW4uZml0LjJwcy5tY21jLCAiMnBzIikKaW4uZml0LjJwcy5sYWcubWNtYy5kZiA8LSBpbi5wbG90LmRmLmZ4KGluLmZpdC4ycHMubGFnLm1jbWMsICIycHMubGFnIikKaW4uZml0LjJwcy5sYWcubWNtYy5lcnIuZGYgPC0gYmluZF9yb3dzKGluLmZpdC4ycHMubGFnLm1jbWMuZXJyLCAuaWQgPSAiUE1lY29fZGVwdGgiKSAlPiUKICBtdXRhdGUobW9kID0gIjJwcy5sYWciLAogICAgICAgICBQTSA9IHN1YnN0cihQTWVjb19kZXB0aCwgMSwgMiksCiAgICAgICAgIEVDTyA9IGZhY3RvcigKICAgICAgICAgICBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpLAogICAgICAgICAgIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIiksIGxhYmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkZXB0aCA9IHN1YnN0cihQTWVjb19kZXB0aCwgNiwgbmNoYXIoUE1lY29fZGVwdGgpKSkKYGBgCgpgYGB7ciBtY21jLWluLXBsb3R9CiMgcGxvdAojIyAycHAgdnMuIDJwcC5sYWcKcmJpbmQoaW4uZml0LjJwcC5tY21jLmRmLCBpbi5maXQuMnBwLmxhZy5tY21jLmRmKSAlPiUKICBtdXRhdGUoUE1fbW9kID0gcGFzdGUoUE0sIG1vZCkpICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiQlN3Zl8xMC0yMCIgJiBQTWVjb19kZXB0aCAhPSAiQlN3Zl8yMC0zMCIgJiBQTWVjb19kZXB0aCAhPSAiQlNyZl8yMC0zMCIgJiBQTWVjb19kZXB0aCAhPSAiQU5wcF8wLTEwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhQTSwgSW4sIGZpbGwgPSBQTV9tb2QsIGNvbG9yID0gUE0sIGdyb3VwID0gUE1fbW9kKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiQU4gMnBwIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAiQlMgMnBwIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgIkdSIDJwcCIgPSBncmFuaXRlLAogICAgICAgICAgICAgICAiQU4gMnBwLmxhZyIgPSAid2hpdGUiLAogICAgICAgICAgICAgICAiQlMgMnBwLmxhZyIgPSAid2hpdGUiLAogICAgICAgICAgICAgICAiR1IgMnBwLmxhZyIgPSAid2hpdGUiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoRUNPKSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMjIDJwcyB2cy4gMnBzLmxhZwpyYmluZChpbi5maXQuMnBzLm1jbWMuZGYsIGluLmZpdC4ycHMubGFnLm1jbWMuZGYpICU+JQogIG11dGF0ZShQTV9tb2QgPSBwYXN0ZShQTSwgbW9kKSkgJT4lCiAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJCU3dmXzEwLTIwIiAmIFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIiAmIFBNZWNvX2RlcHRoICE9ICJCU3JmXzIwLTMwIiAmIFBNZWNvX2RlcHRoICE9ICJBTnBwXzAtMTAiICYgUE1lY29fZGVwdGggIT0gIkdSd2ZfMTAtMjAiICYgUE1lY29fZGVwdGggIT0gIkJTd2ZfMC0xMCIgJiBQTWVjb19kZXB0aCAhPSAiQlNyZl8wLTEwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhQTSwgSW4sIGZpbGwgPSBQTV9tb2QsIGNvbG9yID0gUE0sIGdyb3VwID0gUE1fbW9kKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiQU4gMnBzLCBtY21jIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAiQlMgMnBzLCBtY21jIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgIkdSIDJwcywgbWNtYyIgPSBncmFuaXRlLAogICAgICAgICAgICAgICAiQU4gMnBzLmxhZywgbWNtYyIgPSAid2hpdGUiLAogICAgICAgICAgICAgICAiQlMgMnBzLmxhZywgbWNtYyIgPSAid2hpdGUiLAogICAgICAgICAgICAgICAiR1IgMnBzLmxhZywgbWNtYyIgPSAid2hpdGUiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSwgY29scyA9IHZhcnMoRUNPKSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgMnBwLmxhZyB2cy4gMnBzLmxhZwpyYmluZChpbi5maXQuMnBwLmxhZy5tY21jLmRmLCBpbi5maXQuMnBzLmxhZy5tY21jLmRmKSAlPiUKICBtdXRhdGUoUE1fbW9kID0gcGFzdGUoUE0sIG1vZCksCiAgICAgICAgIFBNZWNvX2RlcHRoX21vZCA9IHBhc3RlKFBNZWNvX2RlcHRoLCBtb2QpKSAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMTAtMjAiICYgUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiICYgUE1lY29fZGVwdGhfbW9kICE9ICJBTnBwXzAtMTAgMnBzLmxhZywgbWNtYyIgJiBQTWVjb19kZXB0aF9tb2QgIT0gIkdSd2ZfMTAtMjAgMnBzLmxhZywgbWNtYyIpICU+JQogIGdncGxvdCguLCBhZXMoUE0sIEluLCBmaWxsID0gUE1fbW9kLCBjb2xvciA9IFBNLCBncm91cCA9IFBNX21vZCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIkFOIDJwcC5sYWcsIG1jbWMiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICJCUyAycHAubGFnLCBtY21jIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgIkdSIDJwcC5sYWcsIG1jbWMiID0gZ3Jhbml0ZSwKICAgICAgICAgICAgICAgIkFOIDJwcy5sYWcsIG1jbWMiID0gIndoaXRlIiwKICAgICAgICAgICAgICAgIkJTIDJwcy5sYWcsIG1jbWMiID0gIndoaXRlIiwKICAgICAgICAgICAgICAgIkdSIDJwcy5sYWcsIG1jbWMiID0gIndoaXRlIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKEVDTyksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIEFJQyBpbgptZXJnZSgKICBhaWMuaS5sYWcuYmVzdC5kZlsgLCBjKCJtb2QiLCAiUE1lY29fZGVwdGgiKV0sIAogIHJiaW5kKGluLmZpdC4xcC5sYWcubWNtYy5kZiwgCiAgICAgICAgaW4uZml0LjJwcC5sYWcubWNtYy5kZiwKICAgICAgICBpbi5maXQuMnBzLmxhZy5tY21jLmRmKSwgCiAgYnkueCA9IGMoIm1vZCIsICJQTWVjb19kZXB0aCIpKSAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiICYgUE1lY29fZGVwdGggIT0gIkJTd2ZfMTAtMjAiICYgUE1lY29fZGVwdGggIT0gIkdSd2ZfMTAtMjAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFBNLCBJbiwgZmlsbCA9IFBNKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICJHUiIgPSBncmFuaXRlKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhFQ08pLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBBSUMsIHcvIGVycgphaWMuaW4ubWNtYy5lcnIuZGYgPC0gbWVyZ2UoCiAgYWljLmkubGFnLmJlc3QuZGZbICwgYygibW9kIiwgIlBNZWNvX2RlcHRoIildLCAKICByYmluZChpbi5maXQuMXAubGFnLm1jbWMuZXJyLmRmLCAKICAgICAgICBpbi5maXQuMnBwLmxhZy5tY21jLmVyci5kZiwKICAgICAgICBpbi5maXQuMnBzLmxhZy5tY21jLmVyci5kZiksIAogIGJ5LnggPSBjKCJtb2QiLCAiUE1lY29fZGVwdGgiKSkKYWljLmluLm1jbWMuZXJyLmRmMiA8LSBhaWMuaW4ubWNtYy5lcnIuZGYKYWljLmluLm1jbWMuZXJyLmRmMlsKICBhaWMuaW4ubWNtYy5lcnIuZGYkUE0gPT0gIkJTIiAmCiAgICBhaWMuaW4ubWNtYy5lcnIuZGYkRUNPID09ICJjb29sIiAmCiAgICBhaWMuaW4ubWNtYy5lcnIuZGYkZGVwdGggPT0gIjEwLTIwIiwgImluX21lYW4iXSA8LSBtZWFuKAogICAgICBhaWMuaW4ubWNtYy5lcnIuZGYyW2FpYy5pbi5tY21jLmVyci5kZiRQTSAhPSAiQlMiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpYy5pbi5tY21jLmVyci5kZiRFQ08gPT0gImNvb2wiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpYy5pbi5tY21jLmVyci5kZiRkZXB0aCA9PSAiMTAtMjAiLCAiaW5fbWVhbiJdKQphaWMuaW4ubWNtYy5lcnIuZGYyWwogIGFpYy5pbi5tY21jLmVyci5kZiRQTSA9PSAiQlMiICYKICAgIGFpYy5pbi5tY21jLmVyci5kZiRFQ08gPT0gImNvb2wiICYKICAgIGFpYy5pbi5tY21jLmVyci5kZiRkZXB0aCA9PSAiMjAtMzAiLCAiaW5fbWVhbiJdIDwtIG1lYW4oCiAgICAgIGFpYy5pbi5tY21jLmVyci5kZjJbYWljLmluLm1jbWMuZXJyLmRmJFBNICE9ICJCUyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWljLmluLm1jbWMuZXJyLmRmJEVDTyA9PSAiY29vbCIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWljLmluLm1jbWMuZXJyLmRmJGRlcHRoID09ICIyMC0zMCIsICJpbl9tZWFuIl0pCmFpYy5pbi5tY21jLmVyci5kZjJbCiAgYWljLmluLm1jbWMuZXJyLmRmJFBNID09ICJCUyIgJgogICAgYWljLmluLm1jbWMuZXJyLmRmJEVDTyA9PSAiY29vbCIgJgogICAgYWljLmluLm1jbWMuZXJyLmRmJGRlcHRoID09ICIxMC0yMCIsICJpbl9zZCJdIDwtIG1lYW4oCiAgICAgIGFpYy5pbi5tY21jLmVyci5kZjJbYWljLmluLm1jbWMuZXJyLmRmJFBNICE9ICJCUyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWljLmluLm1jbWMuZXJyLmRmJEVDTyA9PSAiY29vbCIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWljLmluLm1jbWMuZXJyLmRmJGRlcHRoID09ICIxMC0yMCIsICJpbl9zZCJdKQphaWMuaW4ubWNtYy5lcnIuZGYyWwogIGFpYy5pbi5tY21jLmVyci5kZiRQTSA9PSAiQlMiICYKICAgIGFpYy5pbi5tY21jLmVyci5kZiRFQ08gPT0gImNvb2wiICYKICAgIGFpYy5pbi5tY21jLmVyci5kZiRkZXB0aCA9PSAiMjAtMzAiLCAiaW5fc2QiXSA8LSBtZWFuKAogICAgICBhaWMuaW4ubWNtYy5lcnIuZGYyW2FpYy5pbi5tY21jLmVyci5kZiRQTSAhPSAiQlMiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpYy5pbi5tY21jLmVyci5kZiRFQ08gPT0gImNvb2wiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpYy5pbi5tY21jLmVyci5kZiRkZXB0aCA9PSAiMjAtMzAiLCAiaW5fc2QiXSkKCmdncGxvdChhaWMuaW4ubWNtYy5lcnIuZGYyLCBhZXMoZGVwdGgsIGluX21lYW4sIGZpbGwgPSBQTSkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4ID0gaW5fbWVhbiArIGluX3NkLCB5bWluID0gaW5fbWVhbiksIAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFQ08pLCBjb2xzID0gdmFycyhQTSksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKVG9zcyBsaXN0OgpBTnBwIDAtMTA6IDJwcywgbGFnCkJTd2YgMTAtMjA6IDJwcywgbGFnOyAycHAsIGxhZwpCU3dmIDIwLTMwOiAycHMsIGxhZzsgMnBwLCBsYWcKR1J3ZiAxMC0yMDogMnBzLCBsYWcKCgpgYGB7ciBiYXllcy1maXQtc2Vuc30KIyMgRXh0cmFjdCB0aW1lc2VyaWVzIGRpc3RyaWJ1dGlvbiBlbnZlbG9wZXMgZnJvbSBNQ01DIHBhciBmaXRzCiMgbG9hZCBkYXRhCmlmICghZXhpc3RzKCJwcmVkX3VuY2VydF8ycHAiKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL2JheWVzLXBhci1maXQtMjAyMi0xMS0xNy9wcmVkX3VuY2VydF8ycHBfMTAwMGl0ZXIuUkRhdGEiKQp9CmlmICghZXhpc3RzKCJwcmVkX3VuY2VydF8ycHMiKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL2JheWVzLXBhci1maXQtMjAyMi0xMS0xNy9wcmVkX3VuY2VydF8ycHNfMTAwMGl0ZXIuUkRhdGEiKQp9CmlmICghZXhpc3RzKCJwcmVkX3VuY2VydF8xcC5sYWciKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL2JheWVzLXBhci1maXQtMjAyMi0xMS0yMy9wcmVkX3VuY2VydF8xcF9sYWdfMTAwMGl0ZXIuUkRhdGEiKQp9CmlmICghZXhpc3RzKCJwcmVkX3VuY2VydF8ycHAubGFnIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9iYXllcy1wYXItZml0LTIwMjItMTEtMjkvcHJlZF91bmNlcnRfMnBwX2xhZ18xMDAwMGl0ZXIuUkRhdGEiKQp9CmlmICghZXhpc3RzKCJwcmVkX3VuY2VydF8ycHMubGFnIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9iYXllcy1wYXItZml0LTIwMjItMTItMDEvcHJlZF91bmNlcnRfMnBzX2xhZ18xMDAwMGl0ZXIuUkRhdGEiKQp9CgoKIyBzZW5zaXRpdml0eSBzdW1tYXJ5IGZ4CnNlbnMuc3VtLmZ4IDwtIGZ1bmN0aW9uKG1vZCwgcHJlZF91bmNlcnRfbHMsIHBhcnNfbHMsIGZpdF9sYWcgPSBGQUxTRSkgewogIG5wYXIgPC0gaWZlbHNlKGdyZXBsKDIsIG1vZCksIDMsIGlmZWxzZShncmVwbCgxLCBtb2QpLCAxLCA1KSkKICBpZiAoZml0X2xhZykgewogICAgbnBhciA8LSBucGFyICsgMQogICAgbGFnLmxzIDwtIGxhcHBseShsYXBwbHkocGFyc19scywgIltbIiwgImJlc3RwYXIiKSwgIltbIiwgbnBhcikKICB9CiAgbm1zIDwtIG5hbWVzKHByZWRfdW5jZXJ0X2xzKQogIGxzIDwtIGxhcHBseShzZXFfYWxvbmcocHJlZF91bmNlcnRfbHMpLCBmdW5jdGlvbihpKSB7CiAgICBzUiA8LSBwcmVkX3VuY2VydF9sc1tbaV1dCiAgICBwc2V0IDwtIGF0dHJpYnV0ZXMoc1IpJHBzZXQKICAgIG5vdXQgPC0gbnJvdyhzUikKICAgIGVycm9yIDwtIHJub3JtKG5vdXQsIG1lYW4gPSAwLCBzZCA9IHNxcnQocGFyc19sc1tbaV1dW1sic2lnIl1dW3BzZXRdKSkKICAgIGl2YXIgPC0gKG5wYXIgKyAxKTpuY29sKHNSKQogICAgc1JbICwgaXZhcl0gPC0gc1JbICwgaXZhcl0gKyBlcnJvcgogICAgc20gPC0gc3VtbWFyeShzUikKICAgIHNtJHBvb2wgPC0gcmVwKGMoImJ1bGtDIiwgInJlc3BpcmF0aW9uIiksIGVhID0gbnJvdyhzbSkgLyAyKQogICAgYXRtIDwtIHNtWzE6KG5yb3coc20pIC8gMiksIF0KICAgIGF0bSRNZWFuIDwtIERhdG0kZDE0YwogICAgYXRtWyAsIDM6bmNvbChhdG0pXSA8LSBOQQogICAgYXRtJHBvb2wgPC0gImF0bSIKICAgIGlmIChmaXRfbGFnKSB7CiAgICAgIG1heFggPC0gbWF4KHNtJHgpCiAgICAgIG1pblggPC0gbWluKHNtJHgpCiAgICAgIHNtJHggPC0gc20keCArIHJvdW5kKGxhZy5sc1tbaV1dLCAwKQogICAgICBpZiAoYW55KHNtJHggPiBtYXhYKSkgewogICAgICAgIHNtIDwtIHNtWy13aGljaChzbSR4ID4gbWF4WCksIF0gCiAgICAgIH0KICAgICAgc20gPC0gYmluZF9yb3dzKGxhcHBseShzcGxpdChzbSwgc20kcG9vbCksIGZ1bmN0aW9uKHApIHsKICAgICAgICB4TGFnIDwtIHNlcShtaW5YLCBtaW4ocCR4KSAtIDEpCiAgICAgICAgbGFnLmRmIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSBsZW5ndGgoeExhZyksIG5jb2wgPSBuY29sKHApKSkKICAgICAgICBuYW1lcyhsYWcuZGYpIDwtIG5hbWVzKHApCiAgICAgICAgbGFnLmRmJHggPC0geExhZwogICAgICAgIGxhZy5kZiRwb29sIDwtIHVuaXF1ZShwJHBvb2wpCiAgICAgICAgcmJpbmQobGFnLmRmLCBwKQogICAgICB9KSkKICAgIH0KICAgIHJiaW5kKGF0bSwgc20pICU+JQogICAgICBtdXRhdGUoTW9kZWwgPSBtb2QpICU+JQogICAgICByZW5hbWUoZDE0QyA9IE1lYW4sIHllYXJzID0geCkKICB9KQogIG5hbWVzKGxzKSA8LSBubXMKICByZXR1cm4obHMpCn0KCiMgMXAgdy8gbGFnCnNlbnNfc3VtLjFwLmxhZy5scyA8LSBzZW5zLnN1bS5meCgiMXAubGFnIiwgcHJlZF91bmNlcnRfMXAubGFnLCBiYXllc19maXRfMXAubGFnLCBmaXRfbGFnID0gVFJVRSkKCiMgMnBwCnNlbnNfc3VtLjJwcC5scyA8LSBzZW5zLnN1bS5meCgiMnBwIiwgcHJlZF91bmNlcnRfMnBwLCBiYXllc19maXRfMnBwKQojIHcvIGxhZwpzZW5zX3N1bS4ycHAubGFnLmxzIDwtIHNlbnMuc3VtLmZ4KCIycHAubGFnIiwgcHJlZF91bmNlcnRfMnBwLmxhZywgYmF5ZXNfZml0XzJwcC5sYWcsIGZpdF9sYWcgPSBUUlVFKQoKIyAycHMKc2Vuc19zdW0uMnBzLmxzIDwtIHNlbnMuc3VtLmZ4KCIycHMiLCBwcmVkX3VuY2VydF8ycHMsIGJheWVzX2ZpdF8ycHMpCiMgdy8gbGFnCnNlbnNfc3VtLjJwcy5sYWcubHMgPC0gc2Vucy5zdW0uZngoIjJwcy5sYWciLCBwcmVkX3VuY2VydF8ycHMubGFnLCBiYXllc19maXRfMnBzLmxhZywgZml0X2xhZyA9IFRSVUUpCmBgYAoKYGBge3IgYmF5ZXMtZml0LXBsb3RzLCBldmFsID0gRkFMU0V9CiMgcGxvdCBiYXllcyBmaXRzIHcvIHNlbnNpdGl2aXR5IGVudmVsb3BlcwptdWx0aU1vZC5maXQucGxvdC5meCgKICBzZW5zX3N1bS4ycHAubHMsICIycHAsIE1DTUMiLCBzZW5zX3N1bS4ycHMubHMsICIycHMsIE1DTUMiLCBzZW5zcmFuZ2UgPSBUUlVFLAogIGF2YWxzX3NyID0gYygiMnBwLCBNQ01DIiA9IC4zLCAiMnBzLCBNQ01DIiA9IC4yKSkKCm11bHRpTW9kLmZpdC5wbG90LmZ4KAogIHNlbnNfc3VtLjJwcC5scywgIjJwcCwgTUNNQyIsIHNlbnNfc3VtLjJwcC5sYWcubHMsICIycHAsIGxhZywgTUNNQyIsIHNlbnNyYW5nZSA9IFRSVUUsCiAgYXZhbHNfc3IgPSBjKCIycHAsIE1DTUMiID0gLjMsICIycHAsIGxhZywgTUNNQyIgPSAuMikpCgptdWx0aU1vZC5maXQucGxvdC5meCgKICBzZW5zX3N1bS4xcC5sYWcubHMsICIxcC5sYWcsIE1DTUMiLAogIHNlbnNfc3VtLjJwcC5sYWcubHMsICIycHAubGFnLCBNQ01DIiwKICBzZW5zcmFuZ2UgPSBUUlVFLCBhdmFsc19zciA9IGMoIjFwLmxhZywgTUNNQyIgPSAuMywgIjJwcC5sYWcsIE1DTUMiID0gLjIpKQoKbXVsdGlNb2QuZml0LnBsb3QuZngoCiAgc2Vuc19zdW0uMnBwLmxhZy5scywgIjJwcC5sYWcsIE1DTUMiLAogIHNlbnNfc3VtLjJwcy5sYWcubHMsICIycHMubGFnLCBNQ01DIiwKICBzZW5zcmFuZ2UgPSBUUlVFLCBhdmFsc19zciA9IGMoIjJwcC5sYWcsIE1DTUMiID0gLjMsICIycHMubGFnLCBNQ01DIiA9IC4yKSkKCnNpbmdsZU1vZC5maXQucGxvdC5meChzZW5zX3N1bS4ycHAubGFnLmxzLCAiMnBwLmxhZywgTUNNQyIsIHNlbnNyYW5nZSA9IFRSVUUpCmBgYAoKIyMgTUNNQyBTT0Mgc3RvY2tzCgpgYGB7ciBzb2MtbWNtYy1iZXN0cGFyfQpzb2MubWNtYy5meCA8LSBmdW5jdGlvbihwYXJzLmxzLCBtb2QsIEluLmxzLCAuLi4pIHsKICBpZiAoZ3JlcGwoIjIiLCBtb2QpKSB7CiAgICBwYXIubGVuIDwtIDMKICB9IGVsc2UgewogICAgcGFyLmxlbiA8LSA1CiAgfQogIHNvYy5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMubHMpLCBmdW5jdGlvbihpKSB7CiAgICBkYXRhLmZyYW1lKAogICAgICBzb2MgPSBzb2MuZngocGFycyA9IHBhcnMubHNbW2ldXVtbImJlc3RwYXIiXV1bMTpwYXIubGVuXSwgCiAgICAgICAgICAgICBtb2QgPSBtb2QsCiAgICAgICAgICAgICBJbiA9IEluLmxzW1tpXV0pLAogICAgICBwb29sID0gYygiZmFzdCIsICJzbG93IiksCiAgICAgIG1vZCA9IG1vZCkKICB9KSAgCiAgbmFtZXMoc29jLmxzKSA8LSBuYW1lcyhwYXJzLmxzKQogIHJldHVybihzb2MubHMpCn0Kc29jLjJwcC5sYWcubWNtYy5scyA8LSBzb2MubWNtYy5meChiYXllc19maXRfMnBwLmxhZywgIjJwcCIsIGluLmZpdC4ycHAubGFnLm1jbWMpCnNvYy4ycHMubGFnLm1jbWMubHMgPC0gc29jLm1jbWMuZngoYmF5ZXNfZml0XzJwcy5sYWcsICIycHMiLCBpbi5maXQuMnBzLmxhZy5tY21jKQoKIyBjb21iaW5lIGludG8gZGYKc29jLjJwLmxhZy5tY21jLmRmIDwtIHJiaW5kKGJpbmRfcm93cyhzb2MuMnBwLmxhZy5tY21jLmxzLCAuaWQgPSAiUE1lY29fZGVwdGgiKSwKICAgICAgYmluZF9yb3dzKHNvYy4ycHMubGFnLm1jbWMubHMsIC5pZCA9ICJQTWVjb19kZXB0aCIpKSAlPiUKICBtdXRhdGUoUE1lY28gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDQpLAogICAgICAgICBwbSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjbyksICJhbmRlc2l0ZSIsIAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkJTIiwgUE1lY28pLCAiYmFzYWx0IiwgImdyYW5pdGUiKSksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoInBwIiwgUE1lY28pLCAid2FybSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgid2YiLCBQTWVjbyksICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoUE1lY29fZGVwdGgsICItIiksICJbWyIsIDIpKQoKIyBnZXQgZnJhY3Rpb24gZGF0YQoKCgpzb2MuMnAubGFnLm1jbWMuZGYgJT4lCiAgZmlsdGVyKG1vZCA9PSAiMnBzIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhwb29sLCBzb2MsIGZpbGwgPSBwbSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIiIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCksIGNvbHMgPSB2YXJzKGVjbykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKc29jLjJwLmxhZy5tY21jLmRmICU+JQogIGZpbHRlcihtb2QgPT0gIjJwcCIpICU+JQogIGdncGxvdCguLCBhZXMocG9vbCwgc29jLCBmaWxsID0gcG0pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICIiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZGVwdGgpLCBjb2xzID0gdmFycyhlY28pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCnNvYy4ycC5sYWcubWNtYy5kZiAlPiUKICBmaWx0ZXIoZGVwdGggPT0gIjEwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhwb29sLCBzb2MsIGZpbGwgPSBwbSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIiIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhtb2QpLCBjb2xzID0gdmFycyhlY28pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyBNQ01DIFNBICYgVFQKCmBgYHtyIHNhLXR0LWVycn0KIyBsb2FkIFNBL1RUIGFzIG5lZWRlZAppZiAoIWV4aXN0cygiU0EuVFQuMnBwLmxzIikpIHsKIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9iYXllcy1wYXItZml0LTIwMjItMTItMDgvYmF5ZXNfZml0X1NBX1RUXzJwcF8xMDAwaXRlci5SRGF0YSIpIAp9CmlmICghZXhpc3RzKCJTQS5UVC4ycHMubHMiKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL2JheWVzLXBhci1maXQtMjAyMi0xMi0wOC9iYXllc19maXRfU0FfVFRfMnBzXzEwMDBpdGVyLlJEYXRhIikgCn0KClNBLlRULmV4dHJhY3QuZnggPC0gZnVuY3Rpb24oU0EuVFQubHMsIG1vZCkgewogIGxhcHBseShTQS5UVC5scywgZnVuY3Rpb24oeCkgewogICAgbWVhbkFnZXMgPC0gdW5saXN0KGxhcHBseSh4JHN5c0FnZSwgZnVuY3Rpb24oeSkgewogICAgICB5JG1lYW5TeXN0ZW1BZ2UKICAgIH0pKQogICAgbWVkaWFuQWdlcyA8LSB1bmxpc3QobGFwcGx5KHgkc3lzQWdlLCBmdW5jdGlvbih5KSB7CiAgICAgIHkkcXVhbnRpbGVzU3lzdGVtQWdlWzJdCiAgICB9KSkKICAgIG1lYW5UcmFuc1RzIDwtIHVubGlzdChsYXBwbHkoeCR0cmFuc1QsIGZ1bmN0aW9uKHkpIHsKICAgICAgeSRtZWFuVHJhbnNpdFRpbWUKICAgIH0pKQogICAgbWVkaWFuVHJhbnNUcyA8LSB1bmxpc3QobGFwcGx5KHgkdHJhbnNULCBmdW5jdGlvbih5KSB7CiAgICAgIHkkcXVhbnRpbGVzWzJdCiAgICB9KSkKICAgIGRhdGEuZnJhbWUobWVhbkFnZSA9IG1lYW4obWVhbkFnZXMpLAogICAgICAgICAgICAgICBtZWFuQWdlU0QgPSBzZChtZWFuQWdlcyksCiAgICAgICAgICAgICAgIG1lZGlhbkFnZSA9IG1lYW4obWVkaWFuQWdlcyksCiAgICAgICAgICAgICAgIG1lZGlhbkFnZVNEID0gc2QobWVkaWFuQWdlcyksCiAgICAgICAgICAgICAgIG1lYW5UcmFuc1QgPSBtZWFuKG1lYW5UcmFuc1RzKSwKICAgICAgICAgICAgICAgbWVhblRUU0QgPSBzZChtZWFuVHJhbnNUcyksCiAgICAgICAgICAgICAgIG1lZGlhblRyYW5zVCA9IG1lYW4obWVkaWFuVHJhbnNUcyksCiAgICAgICAgICAgICAgIG1lZGlhblRUU0QgPSBzZChtZWRpYW5UcmFuc1RzKSwKICAgICAgICAgICAgICAgbiA9IGxlbmd0aChtZWFuQWdlcyksCiAgICAgICAgICAgICAgIG1vZCA9IG1vZCkKICB9KQp9CgojIyAxcCB3L2xhZwpzYS50dC4xcC5sYWcubWNtYy5lcnIubHMgPC0gbGFwcGx5KAogIGxhcHBseShTQS5UVC4xcC5sYWcubHMsICJbWyIsICJzeXNBZ2UiKSwgZnVuY3Rpb24oeCkgewogICAgbWVhbkFnZXMgPSB1bmxpc3QoeCkKICAgIGRhdGEuZnJhbWUobWVhbkFnZSA9IG1lYW4obWVhbkFnZXMpLAogICAgICAgICAgICAgICBtZWFuQWdlU0QgPSBzZChtZWFuQWdlcyksCiAgICAgICAgICAgICAgIG1lZGlhbkFnZSA9IG1lZGlhbihtZWFuQWdlcyksCiAgICAgICAgICAgICAgIG1lYW5UcmFuc1QgPSBtZWFuKG1lYW5BZ2VzKSwKICAgICAgICAgICAgICAgbWVhblRUU0QgPSBzZChtZWFuQWdlcyksCiAgICAgICAgICAgICAgIG4gPSBsZW5ndGgobWVhbkFnZXMpLAogICAgICAgICAgICAgICBtb2QgPSAiMXAubGFnIikKICB9KQoKIyMgMnBwCnNhLnR0LjJwcC5tY21jLmVyci5scyA8LSBTQS5UVC5leHRyYWN0LmZ4KFNBLlRULjJwcC5scywgIjJwcCIpCiMgdy8gbGFnCnNhLnR0LjJwcC5sYWcubWNtYy5lcnIubHMgPC0gU0EuVFQuZXh0cmFjdC5meChTQS5UVC4ycHAubGFnLmxzLCAiMnBwLmxhZyIpCgojIyAycHMKc2EudHQuMnBzLm1jbWMuZXJyLmxzIDwtIFNBLlRULmV4dHJhY3QuZngoU0EuVFQuMnBzLmxzLCAiMnBzIikKIyB3LyBsYWcKc2EudHQuMnBzLmxhZy5tY21jLmVyci5scyA8LSBTQS5UVC5leHRyYWN0LmZ4KFNBLlRULjJwcy5sYWcubHMsICIycHMubGFnIikKCiMjIGxhZ3MKbGFnLjFwLm1jbWMuZXJyLmxzIDwtIGxhcHBseShTQS5UVC4xcC5sYWcubHMsIGZ1bmN0aW9uKHgpIHsKICBsYWdzIDwtIHVubGlzdCh4JGxhZykKICBkYXRhLmZyYW1lKG1lYW5MYWcgPSBtZWFuKGxhZ3MpLAogICAgICAgICAgICAgbGFnX3NkID0gc2QobGFncyksCiAgICAgICAgICAgICBuID0gbGVuZ3RoKGxhZ3MpKQp9KQpsYWcuMnBwLm1jbWMuZXJyLmxzIDwtIGxhcHBseShTQS5UVC4ycHAubGFnLmxzLCBmdW5jdGlvbih4KSB7CiAgbGFncyA8LSB1bmxpc3QoeCRsYWcpCiAgZGF0YS5mcmFtZShtZWFuTGFnID0gbWVhbihsYWdzKSwKICAgICAgICAgICAgIGxhZ19zZCA9IHNkKGxhZ3MpLAogICAgICAgICAgICAgbiA9IGxlbmd0aChsYWdzKSkKfSkKbGFnLjJwcy5tY21jLmVyci5scyA8LSBsYXBwbHkoU0EuVFQuMnBzLmxhZy5scywgZnVuY3Rpb24oeCkgewogIGxhZ3MgPC0gdW5saXN0KHgkbGFnKQogIGRhdGEuZnJhbWUobWVhbkxhZyA9IG1lYW4obGFncyksCiAgICAgICAgICAgICBsYWdfc2QgPSBzZChsYWdzKSwKICAgICAgICAgICAgIG4gPSBsZW5ndGgobGFncykpCn0pCmBgYCAgCiAgCmBgYHtyIHNhLXR0LW1lYW4tbWVkLXBsb3RzfQojIHBsb3QgZGYKc2EudHQuMnBwLjJwcy5tY21jLmVyci5kZiA8LSByYmluZCgKICBiaW5kX3Jvd3Moc2EudHQuMnBwLm1jbWMuZXJyLmxzLCAuaWQgPSAiUE1lY29fZGVwdGgiKSwKICBiaW5kX3Jvd3Moc2EudHQuMnBzLm1jbWMuZXJyLmxzLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkgJT4lCiAgbXV0YXRlKG1vZCA9IGMocmVwKCIycHAiLCBsZW5ndGgoc2EudHQuMnBwLm1jbWMuZXJyLmxzKSksCiAgICAgICAgICAgICAgICAgcmVwKCIycHMiLCBsZW5ndGgoc2EudHQuMnBzLm1jbWMuZXJyLmxzKSkpLAogICAgICAgICBwbSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjb19kZXB0aCksICJhbmRlc2l0ZSIsIAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkJTIiwgUE1lY29fZGVwdGgpLCAiYmFzYWx0IiwgImdyYW5pdGUiKSksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoInBwIiwgUE1lY29fZGVwdGgpLCAid2FybSIsIAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIndmIiwgUE1lY29fZGVwdGgpLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwgCiAgICAgICAgIG1pZGRlcHRoID0gaWZlbHNlKGdyZXBsKCIwLTEwIiwgUE1lY29fZGVwdGgpLCA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIxMC0yMCIsIFBNZWNvX2RlcHRoKSwgMTUsIDI1KSkpCgojIG1lYW4gYWdlcwojIyAycHAgW05COiBHUnJmXzIwLTMwIHRvbyBvbGQgaW4gMnBzIGZpdF0Kc2EudHQuMnBwLjJwcy5tY21jLmVyci5kZiAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiKSAlPiUKICBmaWx0ZXIobW9kID09ICIycHAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBtLCBtZWFuQWdlLCBmaWxsID0gcG0sIGNvbG9yID0gcG0sIGFscGhhID0gbW9kKSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuQWdlLCB5bWF4ID0gbWVhbkFnZSArIG1lYW5BZ2VTRCksIAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICIiLAogICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgbmFtZSA9ICIiLAogICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCgKICAgIG5hbWUgPSAiIiwKICAgIHZhbHVlcyA9IGMoIjJwcCIgPSAxLAogICAgICAgICAgICAgICAiMnBzIiA9IC42KSkgKwogICMgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDUwMCkpICsgIyAycHAKICAjIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMDAwKSkgKyAjIDJwcwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZWNvKSwgcm93cyA9IHZhcnMobWlkZGVwdGgpLCBzY2FsZXMgPSAiZnJlZSIpICsKICB4bGFiKCJBZ2UiKSArCiAgeWxhYigiRGVuc2l0eSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyB0cmFuc2l0IHRpbWUKc2EudHQuMnBwLjJwcy5tY21jLmVyci5kZiAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiKSAlPiUKICBmaWx0ZXIobW9kID09ICIycHAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBtLCBtZWFuVHJhbnNULCBmaWxsID0gcG0sIGNvbG9yID0gcG0sIGFscGhhID0gbW9kKSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuVHJhbnNULCB5bWF4ID0gbWVhblRyYW5zVCArIG1lYW5UVFNEKSwgCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIiIsCiAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICBuYW1lID0gIiIsCiAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKAogICAgbmFtZSA9ICIiLAogICAgdmFsdWVzID0gYygiMnBwIiA9IDEsCiAgICAgICAgICAgICAgICIycHMiID0gLjYpKSArCiAgIyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNTAwKSkgKyAjIDJwcAogICMgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEwMDApKSArICMgMnBzCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhlY28pLCByb3dzID0gdmFycyhtaWRkZXB0aCksIHNjYWxlcyA9ICJmcmVlIikgKwogIHhsYWIoIkFnZSIpICsKICB5bGFiKCJEZW5zaXR5IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIGxhZ2dlZCBtb2RlbHMKIyMgYWdlcwpzYS4ycHAuMnBzLmxhZy5tY21jLmRmICU+JQogIG11dGF0ZShkZXB0aCA9IHNhcHBseShzdHJzcGxpdChzYS4ycHAuMnBzLmxhZy5tY21jLmRmJFBNZWNvX2RlcHRoLCAiLSIpLCAiW1siLCAyKSkgJT4lCiAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJCU3dmXzIwLTMwIiAmIFBNZWNvX2RlcHRoICE9ICJBTnBwXzAtMTAiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBtLCBhZ2UsIGZpbGwgPSBwbSwgYWxwaGEgPSBtb2QpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGFnZSAtIGFnZV9zZCwgeW1heCA9IGFnZSArIGFnZV9zZCksIHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgbmFtZSA9ICIiLAogICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCgKICAgIG5hbWUgPSAiIiwKICAgIHZhbHVlcyA9IGMoIjJwcCIgPSAxLAogICAgICAgICAgICAgICAiMnBzIiA9IC42KSkgKwogICMgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDUwMCkpICsgIyAycHAKICAjIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMDAwKSkgKyAjIDJwcwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZWNvKSwgcm93cyA9IHZhcnMoZGVwdGgpLCBzY2FsZXMgPSAiZnJlZSIpICsKICB5bGFiKCJBZ2UgKHkpIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQoKIyB0cmFuc2l0IHRpbWUKc2EuMnBwLjJwcy5sYWcubWNtYy5kZiAlPiUKICBtdXRhdGUoZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoc2EuMnBwLjJwcy5sYWcubWNtYy5kZiRQTWVjb19kZXB0aCwgIi0iKSwgIltbIiwgMikpICU+JQogIGdncGxvdCguLCBhZXMocG0sIHR0LCBmaWxsID0gcG0sIGFscGhhID0gbW9kKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSB0dCAtIHR0X3NkLCB5bWF4ID0gdHQgKyB0dF9zZCksIHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgbmFtZSA9ICIiLAogICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIjJwcCIgPSAxLAogICAgICAgICAgICAgICAiMnBzIiA9IC42KSkgKwogICMgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDUwMCkpICsgIyAycHAKICAjIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMDAwKSkgKyAjIDJwcwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZWNvKSwgcm93cyA9IHZhcnMoZGVwdGgpLCBzY2FsZXMgPSAiZnJlZSIpICsKICB5bGFiKCJUcmFuc2l0IFRpbWUgKHkpIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQoKIyBBZ2VzOiBsYWcgdnMuIG5vIGxhZwpyYmluZChzYS4ycHAuMnBzLm1jbWMuZGYsIHNhLjJwcC4ycHMubGFnLm1jbWMuZGYpICU+JQogIG11dGF0ZShkZXB0aCA9IHNhcHBseShzdHJzcGxpdChQTWVjb19kZXB0aCwgIi0iKSwgIltbIiwgMiksCiAgICAgICAgIGxhZyA9IHJlcChjKCJubyIsICJ5ZXMiKSwgZWEgPSBucm93KHNhLjJwcC4ycHMubWNtYy5kZikpKSAlPiUKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiICYgUE1lY29fZGVwdGggIT0gIkFOcHBfMC0xMCIpICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiR1JyZl8yMC0zMCIgJiBQTWVjb19kZXB0aCAhPSAiR1JyZl8xMC0yMCIpICU+JQogICMgZmlsdGVyKGVjbyA9PSAiY29vbCIpICU+JQogIGZpbHRlcihtb2QgPT0gIjJwcCIpICU+JQogICMgZmlsdGVyKG1vZCA9PSAiMnBzIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhwbSwgYWdlLCBmaWxsID0gcG0sIGFscGhhID0gbGFnKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgbmFtZSA9ICIiLAogICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIm5vIiA9IDEsCiAgICAgICAgICAgICAgICJ5ZXMiID0gLjYpKSArCiAgIyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNTAwKSkgKyAjIDJwcAogICMgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEwMDApKSArICMgMnBzCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhlY28pLCByb3dzID0gdmFycyhkZXB0aCksIHNjYWxlcyA9ICJmcmVlIikgKwogIHhsYWIoIkFnZSIpICsKICB5bGFiKCJEZW5zaXR5IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgpzYS4ycHAuMnBzLmxhZy5tY21jLmRmICU+JQogIG11dGF0ZShkZXB0aCA9IHNhcHBseShzdHJzcGxpdChQTWVjb19kZXB0aCwgIi0iKSwgIltbIiwgMikpICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiQlN3Zl8yMC0zMCIgJiBQTWVjb19kZXB0aCAhPSAiQU5wcF8wLTEwIikgJT4lCiAgZmlsdGVyKFBNZWNvX2RlcHRoICE9ICJHUnJmXzIwLTMwIiAmIFBNZWNvX2RlcHRoICE9ICJHUnJmXzEwLTIwIikgJT4lCiAgIyBmaWx0ZXIoZWNvID09ICJjb29sIikgJT4lCiAgIyBmaWx0ZXIobW9kID09ICIycHAiKSAlPiUKICAjIGZpbHRlcihtb2QgPT0gIjJwcyIpICU+JQogIGdncGxvdCguLCBhZXMocG0sIGFnZSwgZmlsbCA9IHBtLCBhbHBoYSA9IG1vZCkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIG5hbWUgPSAiIiwKICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICBzY2FsZV9hbHBoYV9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCIycHAiID0gMSwKICAgICAgICAgICAgICAgIjJwcyIgPSAuNikpICsKICAjIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA1MDApKSArICMgMnBwCiAgIyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwMCkpICsgIyAycHMKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGVjbyksIHJvd3MgPSB2YXJzKGRlcHRoKSwgc2NhbGVzID0gImZyZWUiKSArCiAgeWxhYigiQWdlICh5KSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgIApgYGAgIAoKYGBge3Igc2EtdHQtZG5zLXBsb3RzfQpzYS50dC5tY21jLmRucy5meCA8LSBmdW5jdGlvbihwYXIubHMsIG1vZCwgaW4uZml0LmxzLCBtYXhJdHIgPSA1MDApIHsKICAKICAjIGdldCBwYXIgbGVuZ3RoCiAgaWYgKGdyZXBsKCIxcCIsIG1vZCkpIHsKICAgIHBhci5sZW4gPC0gMQogIH0gZWxzZSBpZiAoZ3JlcGwoIjJwIiwgbW9kKSkgewogICAgcGFyLmxlbiA8LSAzCiAgfSBlbHNlIHsKICAgIHBhci5sZW4gPC0gNQogIH0KICAKICAjIGdldCBubXMKICBubXMgPC0gbmFtZXMocGFyLmxzKQogIGxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFyLmxzKSwgZnVuY3Rpb24oaSkgewogICAgCiAgICAjIGdldCBpbnB1dAogICAgSU4gPC0gaW4uZml0LmxzW1tpXV0KICAgIAogICAgIyBnZXQgcGFycwogICAgUEFSUyA8LSBwYXIubHNbW2ldXVsxOnBhci5sZW5dCiAgICAKICAgICMgcnVuIHNvYy5meAogICAgc29jLm91dCA8LSBzb2MuZngocGFycyA9IFBBUlMsIG1vZCA9IG1vZCwgSW4gPSBJTiwgbW9kX21hdCA9IFRSVUUpCiAgICAKICAgICMgc2V0IGluZGV4IGZvciBkaXN0aWJ1dGlvbnMKICAgIGEgPC0gc2VxKDEsIG1heEl0cikKICAgIHNhIDwtIHN5c3RlbUFnZShBID0gc29jLm91dCRBX21hdCwgdSA9IHNvYy5vdXQkaW5fdmVjdG9yLCBhID0gYSkKICAgIHR0IDwtIHRyYW5zaXRUaW1lKHNvYy5vdXQkQV9tYXQsIHUgPSBzb2Mub3V0JGluX3ZlY3RvcikKICAgIGxpc3QoYWdlcyA9IHNhLCB0dGltZSA9IHR0KQogIH0pCiAgbmFtZXMobHMpIDwtIG5tcwogIGxzCn0KCnNhLnR0LjJwcC5tY21jLmRucy5scyA8LSBzYS50dC5tY21jLmRucy5meCgKICBwYXJzLmZpdC4ycHAubWNtYywgIjJwcCIsIGluLmZpdC4ycHAubWNtYykKc2EudHQuMnBzLm1jbWMuZG5zLmxzIDwtIHNhLnR0Lm1jbWMuZG5zLmZ4KAogIHBhcnMuZml0LjJwcy5tY21jLCAiMnBzIiwgaW4uZml0LjJwcy5tY21jKQojIGxhZ2dlZCBtb2RlbHMKIyBzYS50dC4xcC5sYWcubWNtYy5scyA8LSBzYS50dC5tY21jLmZ4KHBhcnMuZml0LjFwLmxhZy5tY21jLCAiMXAiLCBpbi5maXQuMXAubGFnLm1jbWMpCnNhLnR0LjJwcC5sYWcubWNtYy5kbnMubHMgPC0gc2EudHQubWNtYy5kbnMuZngoCiAgcGFycy5maXQuMnBwLmxhZy5tY21jLCAiMnBwIiwgaW4uZml0LjJwcC5sYWcubWNtYykKc2EudHQuMnBzLmxhZy5tY21jLmRucy5scyA8LSBzYS50dC5tY21jLmRucy5meCgKICBwYXJzLmZpdC4ycHMubGFnLm1jbWMsICIycHMiLCBpbi5maXQuMnBzLmxhZy5tY21jKQoKIyBmeCBmb3IgZXh0cmFjdGluZyBzeXN0ZW0gYWdlL3RyYW5zaXQgdGltZSBkZW5zaXRpZXMKc2EudHQuZGVucy5kZi5meCA8LSBmdW5jdGlvbihzYS50dC5scywgdmFsdWUsIG1vZCkgewogIGlmICh2YWx1ZSA9PSAiYWdlIikgewogICAgbHMgPC0gbGFwcGx5KHNhLnR0LmxzLCBmdW5jdGlvbih4KSB4W1sxXV1bWyJzeXN0ZW1BZ2VEZW5zaXR5Il1dKSAKICB9IGVsc2UgewogICAgbHMgPC0gbGFwcGx5KHNhLnR0LmxzLCBmdW5jdGlvbih4KSB4W1syXV1bWyJ0cmFuc2l0VGltZURlbnNpdHkiXV0pIAogIH0KICBhcnIgPC0gYmluZF9jb2xzKGxzKQogIGRmIDwtIGRhdGEuZnJhbWUoUE1lY29fZGVwdGggPSByZXAoZGltbmFtZXMoYXJyKVtbMl1dLCBlYWNoID0gbnJvdyhhcnIpKSwKICAgICAgICAgICAgICAgICAgIG1vZCA9IG1vZCwKICAgICAgICAgICAgICAgICAgIHByb3AgPSByZXAoc2VxKDEsIG5yb3coYXJyKSksIG5jb2woYXJyKSksCiAgICAgICAgICAgICAgICAgICBkZW5zID0gdW5saXN0KGxzKSkKICBuYW1lcyhkZilbd2hpY2gobmFtZXMoZGYpID09ICJwcm9wIildIDwtIHZhbHVlCiAgZGYgJT4lCiAgICBtdXRhdGUocG0gPSBpZmVsc2UoZ3JlcGwoIkFOIiwgUE1lY29fZGVwdGgpLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQlMiLCBQTWVjb19kZXB0aCksICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKGdyZXBsKCJ3ZiIsIFBNZWNvX2RlcHRoKSwgImNvb2wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgicmYiLCBQTWVjb19kZXB0aCksICJjb2xkIiwgIndhcm0iKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpKQp9CgojIGdldCBhZ2UgZGVuc2l0aWVzCnNhLjJwcC4ycHMubWNtYy5kbnMuZGYgPC0gcmJpbmQoCiAgc2EudHQuZGVucy5kZi5meChzYS50dC4ycHAubWNtYy5kbnMubHMsICJhZ2UiLCAiMnBwIiksIHNhLnR0LmRlbnMuZGYuZngoc2EudHQuMnBzLm1jbWMuZG5zLmxzLCAiYWdlIiwgIjJwcyIpKQoKIyBnZXQgdHQgZGVuc2l0aWVzCnR0LjJwcC4ycHMubWNtYy5kbnMuZGYgPC0gcmJpbmQoCiAgc2EudHQuZGVucy5kZi5meChzYS50dC4ycHAubWNtYy5kbnMubHMsICJ0dCIsICIycHAiKSwgc2EudHQuZGVucy5kZi5meChzYS50dC4ycHMubWNtYy5kbnMubHMsICJ0dCIsICIycHMiKSkKCiMgcGxvdCBkaXN0cmlidXRpb25zCmdncGxvdChzYS4ycHAuMnBzLm1jbWMuZGVucy5kZiwgYWVzKGFnZSwgZGVucykpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gcG0pKSArCiAgIyBnZW9tX3ZsaW5lKGRhdGEgPSBzYS4ycHAuMnBzLm1jbWMuZGYsIGFlcyh4aW50ZXJjZXB0ID0gYWdlLCBjb2xvciA9IHBtKSwKICAjICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiIiwKICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICAjIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA1MDApLCB5bGltID0gYygwLCApKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhtb2QpLCByb3dzID0gdmFycyhlY28pLCBzY2FsZXMgPSAiZnJlZSIpICsKICB4bGFiKCJBZ2UiKSArCiAgeWxhYigiRGVuc2l0eSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIyBBZ2VzClN5c3RlbSBhZ2VzIGZvciB0aGUgc2VyaWVzIG1vZGVsIGZpdHMgdGVuZCB0byBiZSBvbGRlciB0aGFuIHRoZSBwYXJhbGxlbCBmaXRzLiBBZGRpdGlvbmFsbHksIHNvbWUgb2YgdGhlIGFnZXMgYXJlIHVucmVhbGlzdGljYWxseSBvbGQ6IEFOcHAgMC0xMCAoMzI3NDQpLiBBZ2VzIGZvciBib3RoIHRoZSBwYXJhbGxlbCBhbmQgc2VyaWVzIGZpdHMgYXJlIGV4dHJhb3JkaW5hcmlseSBvbGQgZm9yIHRoZSBCU3dmXzIwLTMwIHNpdGUsIGFsdGhvdWdoIHRoZSBzZXJpZXMgbW9kZWwgYWdlIGlzIGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBncmVhdGVyIHRoYW4gdGhlIHBhcmFsbGVsIG1vZGVsOiBzZXJpZXMgPSA5MjE1MzYgeSwgcGFyYWxsZWwgPSA5NDc2MCB5LiBUaGUgYWdlIGZvciB0aGUgQU5wcF8wLTEwIHNpdGUgaXMgYWxzbyB0b28gb2xkIGZvciBwYXJhbGxlbCBtb2RlbDogMTAzMiB5IChhbHRob3VnaCBzdGlsbCBhbiBvcmRlciBvZiBtYWduaXR1ZGUgeW91bmdlciB0aGFuIHRoZSBzZXJpZXMgbW9kZWwgYWdlIGZvciB0aGUgc2FtZSBzaXRlIGFuZCBkZXB0aCkuCgojIyMgVHJhbnNpdCB0aW1lcwpUcmFuc2l0IHRpbWVzIGZvciB0aGUgcGFyYWxsZWwgbW9kZWxzIHNlZW0gbW9zdGx5IHJlYXNvbmFibGUuIFRoZSBjb29sIGNsaW1hdGUgYmFzYWx0IHNvaWxzIGZyb20gdGhlIHR3byBkZWVwZXN0IGxheWVycyBhcmUgYW4gZXhjZXB0aW9uIGluIHRoYXQgdGhleSBhcmUgbmVhcmx5IDAsIGluZGljYXRpbmcgYSBmYWlsdXJlIG9uIHRoZSBwYXJ0IG9mIHRoZSBtb2RlbCBvciBwb29yIGRhdGEuIFNwZWNpZmljYWxseSwgdGhlIHJlYXNvbiB0aGF0IEJTd2ZfMjAtMzAgaXMgdGhlIHdvcnN0IGZpdHRpbmcgc2l0ZSBmb3IgYm90aCBtb2RlbCBzdHJ1Y3R1cmVzIGlzIGxpa2VseSByZWxhdGVkIHRvIGEgZmFpbHVyZSB0byByZXNhbXBsZSB0aGUgc2FtZSBzaXRlLCBkdWUgdG8gbG9nZ2luZyBpbiAyMDE5IGFuZCBwb3NzaWJseSBhIGZhaWx1cmUgdG8gbG9jYXRlIHRoZSBjb3JyZWN0IHNpdGUgaW4gMjAwOS4KCkluIGNvbnRyYXN0LCB0aGUgdHdvIGRlZXBlc3QgR1JyZiBzaXRlcyBoYXZlIG92ZXJseSBsb25nIHRyYW5zaXQgdGltZXMgZm9yIGJvdGggbW9kZWwgc3RydWN0dXJlcywgbGlrZWx5IGEgZnVuY3Rpb24gb2YgdGhlIGFub21vbG91c2x5IG9sZCByZXNwaXJlZCAxNEMgc2lnbmFsIGF0IHRoaXMgc2l0ZSBmb3IgdGhlc2UgZGVwdGhzLiBUaGUgdHJlbmQgaXMgYWxzbyBwb3RlbnRpYWxseSBhcHBhcmVudCBpbiB0aGUgc3VyZmFjZSBzb2lsLCB3aGVyZSB0aGUgdHJhbnNpdCB0aW1lIGlzIG5lYXJseSAxNTAgeWVhcnMgZm9yIHRoZSBwYXJhbGxlbCBtb2RlbCwgY29tcGFyZWQgdG8gNzUgeWVhcnMgZm9yIHRoZSBhbmRlc2l0aWMgYW5kIGJhc2FsdGljIHNvaWxzLiBIb3dldmVyLCB0aGlzIGlzIG5vdCB2aXNpYmxlIGluIHRoZSBzZXJpZXMgbW9kZWwgZm9yIHRoaXMgc2l0ZSBhbmQgZGVwdGguCgpPdmVyYWxsLCB0aGUgdHJhbnNpdCB0aW1lcyBmb3IgdGhlIHNlcmllcyBtb2RlbHMgZG8gbm90IHNlZW0gcmVhbGlzdGljLiBQZXJoYXBzIHRoaXMgaXMgcmVmbGVjdGVkIGluIHRoZSBlc3RpbWF0ZXMgZm9yIGlucHV0cyBhcyB3ZWxsPyBXb3VsZCBiZSBpbnRlcmVzdGluZyB0byBzZWUgaWYgdGhlIGxhZ2dlZCBtb2RlbHMgcGVyZm9ybSBiZXR0ZXIuCgojIyMgU0EgJiBUVCBmb3IgbGFnZ2VkIG1vZGVscwpUaGUgbGFnZ2VkIG1vZGVscyBzaG93IHNpbWlsYXIgdHJlbmRzIHRvIHRoZSBtb2RlbHMgd2l0aG91dCBsYWdzLCB3aXRoIG1vcmUgc2l0ZXMgcmV0dXJuaW5nIGJvdGggYWdlcyBhbmQgdHJhbnNpdCB0aW1lcyB0aGF0IGFyZSB1bnJlYWxpc3RpY2FsbHkgb2xkIGZvciB0aGUgc2VyaWVzIG1vZGVsIHN0cnVjdHVyZSB0aGFuIHRoZSBwYXJhbGxlbCBzdHJ1Y3R1cmUuIAoKT2RkbHkgSSBkb24ndCBvYnNlcnZlIGxhcmdlIGRpZmZlcmVuY2VzIGluIGVpdGhlciBhZ2Ugb3IgdHJhbnNpdCB0aW1lIGJldHdlZW4gdGhlIGxhZ2dlZCBhbmQgdW5sYWdnZWQgbW9kZWwgZml0cy4gVGhlIGV4Y2VwdGlvbnMgYXJlIHRoZSBzaXRlcyB3aGVyZSB0aGUgbW9kZWwgYXBwZWFycyB0byBoYXZlIGZvdW5kIGxvY2FsIG1pbmltYSwgYW5kIHRoZSBhZ2UvdHJhbnNpdCB0aW1lIHN0YXRpc3RpYyBpcyB1bnJlYXNvbmFibHkgaGlnaCAob3IgbG93KSBmb3IgZWl0aGVyIHRoZSBsYWdnZWQgb3IgdW5sYWdnZWQgZml0LgoKYGBge3IgbW9tLXBhcnRpdGlvbmluZ30KbW9tLnBhcnQuZGYgPC0gZGF0YS5mcmFtZShmYXN0LCBzbG93LCBmcG9tLCBvcG9tLCBtb20sIGxvc3MpICU+JQogIG11dGF0ZShtb21GYXN0R2FtID0gKGZhc3QgLSBmcG9tIC0gbG9zcykgLyBtb20pCgojIGdldCBkYXRhIGZyYW1lIG9mIGZhc3QgJiBzbG93IHByb3BvcnRpb25zCgoKYGBgCgpgYGB7ciBtaW5DLW1vZC1maXR9CiMgbG9hZCBmcmMgMTRjIGRhdGEgYW5kIGZpbHRlciB0byB0aGVybWFsbHkgZnJhY3Rpb25hdGVkIHNhbXBsZXMKbG9hZCgiL1VzZXJzL2plZmYvc3JhLWZyYy9zb3VyY2UvZGVucy4wMS4wOS4xOS5zcC5kZi5SRGF0YSIpCnRtbC5mcmMuc2V0IDwtIGxhcHBseShzcGxpdChkZW5zLjAxLjA5LjE5LnNwLmRmLCBkZW5zLjAxLjA5LjE5LnNwLmRmJFBNZWNvX2RlcHRoKVtjKDksIDE4LCAyNyldLCBmdW5jdGlvbih4KSB7CiAgeFt3aGljaCh4JGZyYyA9PSAibWluQyIpLCBdCn0pCgojIGV4dHJhY3QgTEYgZGF0YSBmb3IgR1JyZiBzaXRlcwpkZW5zLjAxLjA5LjE5LnNwLmRmCgojIGZpdCBtb2RlbHMKR1JwcF8xMC4ycHAubGFnLnAgPC0gc2luZ2xlTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuMnBwLmxhZy5tY21jWyJHUnBwXzAtMTAiXSwgIjJwcCwgbGFnLCBNQ01DIikKQlNwcF8xMC4ycHAubGFnLnAgPC0gc2luZ2xlTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuMnBwLmxhZy5tY21jWyJCU3BwXzAtMTAiXSwgIjJwcCwgbGFnLCBNQ01DIikKQU5wcF8xMC4ycHAubGFnLnAgPC0gc2luZ2xlTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuMnBwLmxhZy5tY21jWyJBTnBwXzAtMTAiXSwgIjJwcCwgbGFnLCBNQ01DIikKCkdSd2ZfMTAuMnBwLmxhZy5wIDwtIHNpbmdsZU1vZC5maXQucGxvdC5meChtb2QuZml0dGVkLjJwcC5sYWcubWNtY1siR1J3Zl8wLTEwIl0sICIycHAsIGxhZywgTUNNQyIpCkJTd2ZfMTAuMnBwLmxhZy5wIDwtIHNpbmdsZU1vZC5maXQucGxvdC5meChtb2QuZml0dGVkLjJwcC5sYWcubWNtY1siQlN3Zl8wLTEwIl0sICIycHAsIGxhZywgTUNNQyIpCkFOd2ZfMTAuMnBwLmxhZy5wIDwtIHNpbmdsZU1vZC5maXQucGxvdC5meChtb2QuZml0dGVkLjJwcC5sYWcubWNtY1siQU53Zl8wLTEwIl0sICIycHAsIGxhZywgTUNNQyIpCgpHUnBwXzIwLjJwcC5sYWcucCA8LSBzaW5nbGVNb2QuZml0LnBsb3QuZngobW9kLmZpdHRlZC4ycHAubGFnLm1jbWNbIkdScHBfMTAtMjAiXSwgIjJwcCwgbGFnLCBNQ01DIikKQlNwcF8yMC4ycHAubGFnLnAgPC0gc2luZ2xlTW9kLmZpdC5wbG90LmZ4KG1vZC5maXR0ZWQuMnBwLmxhZy5tY21jWyJCU3BwXzEwLTIwIl0sICIycHAsIGxhZywgTUNNQyIpCkFOcHBfMjAuMnBwLmxhZy5wIDwtIHNpbmdsZU1vZC5maXQucGxvdC5meChtb2QuZml0dGVkLjJwcC5sYWcubWNtY1siQU5wcF8xMC0yMCJdLCAiMnBwLCBsYWcsIE1DTUMiKQoKR1J3Zl8xMC4ycHAubGFnLnAgIyBub3JtYWwgR1IKQU53Zl8xMC4ycHAubGFnLnAgIyB2ZXJ5IG9sZCBzbG93IHBvb2wKR1JwcF8xMC4ycHAubGFnLnAKQlNwcF8xMC4ycHAubGFnLnAKCkFOcHBfMjAuMnBwLmxhZy5wICMgbm9ybWFsIGFuZGVzaXRlCkdScHBfMjAuMnBwLmxhZy5wICMgbG9uZyBsYWc7IGludGVyZXN0aW5nIHNsb3cgcG9vbCBkeW5hbWljcwpCU3BwXzIwLjJwcC5sYWcucCAjIG5vcm1hbAoKR1J3Zl8xMC4ycHAubGFnLnAyIDwtIEdSd2ZfMTAuMnBwLmxhZy5wW1sxXV0gKwogIGdndGl0bGUoIiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0yMDAsIDgwMCwgMjAwKSwgbGltaXRzID0gYygtMzAwLCA4MjApKSArCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCkFOd2ZfMTAuMnBwLmxhZy5wMiA8LSBBTndmXzEwLjJwcC5sYWcucFtbMV1dICsKICBnZ3RpdGxlKCIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMjAwLCA4MDAsIDIwMCksIGxpbWl0cyA9IGMoLTMwMCwgODIwKSkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQpnZ3NhdmUoIi9Vc2Vycy9qZWZmL0RvY3VtZW50cy9Qb3N0RG9jL0V4ZXRlci9wbG90cy9BTndmXzEwLjJwcC5sYWcucC5wbmciLCAKICAgICAgIHBsb3QgPSBBTndmXzEwLjJwcC5sYWcucDIsCiAgICAgICB3aWR0aCA9IDUuMiwgaGVpZ2h0ID0gMy41LCB1bml0cyA9IGMoImluIikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvRG9jdW1lbnRzL1Bvc3REb2MvRXhldGVyL3Bsb3RzL0dSd2ZfMTAuMnBwLmxhZy5wLnBuZyIsIAogICAgICAgcGxvdCA9IEdSd2ZfMTAuMnBwLmxhZy5wMiwKICAgICAgIHdpZHRoID0gNS4yLCBoZWlnaHQgPSAzLjUsIHVuaXRzID0gYygiaW4iKSkKCkFOcmZfMTAuMnBwLmxhZy5wIDwtIHNpbmdsZU1vZC5maXQucGxvdC5meCgKICBtb2QuZml0dGVkLjJwcC5sYWcubWNtY1siQU5yZl8wLTEwIl0sICIycHAsIGxhZywgTUNNQyIpCmBgYAoKYGBge3IgaGFydGxleS1wbG90c30KbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9yYXMxOC5zcC5kZi5SRGF0YSIpCm9wdGlvbnMoYml0bWFwVHlwZSA9ICJjYWlybyIpCgpzaW5nbGVNb2QuZml0LnBsb3QuZngobW9kLmZpdHRlZC4ycHAubGFnLm1jbWMsICIycHAsIGxhZywgTUNNQyIpCgojIHdhcm0gc2l0ZQpwcF8yMC4ycHAubGFnLmxzIDwtIG1vZC5maXR0ZWQuMnBwLmxhZy5tY21jW2dyZXAoInBwXzEwLTIwIiwgbmFtZXMobW9kLmZpdHRlZC4ycHAubGFnLm1jbWMpKV0KcHBfMjAuMnBwLmxhZy5kZiA8LSBiaW5kX3Jvd3MocHBfMjAuMnBwLmxhZy5scywgLmlkID0gIlBNZWNvX2RlcHRoIikgJT4lCiAgbXV0YXRlKHBtID0gaWZlbHNlKGdyZXBsKCJBTiIsIFBNZWNvX2RlcHRoKSwgImFuZGVzaXRlIiwgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvX2RlcHRoKSwgImJhc2FsdCIsICJncmFuaXRlIikpKQpwcF8yMC4ycHAubGFnLmNvbi5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHNlcV9hbG9uZyhuYW1lcyhwcF8yMC4ycHAubGFnLmxzKSksIGZ1bmN0aW9uKGkpIHsKICBjb24uZGYuZngobmFtZXMocHBfMjAuMnBwLmxhZy5sc1tpXSkpCn0pLCAuaWQgPSAiUE1lY29fZGVwdGgiKSAlPiUKICBtdXRhdGUocG0gPSBpZmVsc2UoUE1lY29fZGVwdGggPT0gMSwgImFuZGVzaXRlIiwgaWZlbHNlKFBNZWNvX2RlcHRoID09IDIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCiMgYXRtCmF0bSA8LSBwcF8yMC4ycHAubGFnLmRmICU+JSBmaWx0ZXIocG9vbCA9PSAiYXRtIiAmIHBtID09ICJhbmRlc2l0ZSIpCgpwcC5wIDwtIHBwXzIwLjJwcC5sYWcuZGYgJT4lCiAgZmlsdGVyKHBvb2wgPT0gImJ1bGtDIiB8IHBvb2wgPT0gInJlc3BpcmF0aW9uIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh5ZWFycywgZDE0QykpICsKICBnZW9tX3BhdGgoZGF0YSA9IGF0bSwgYWVzKHllYXJzLCBkMTRDKSwgc2l6ZSA9IC4xKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBtLCBsaW5ldHlwZSA9IHBvb2wpLCBzaXplID0gLjgpICsKICBnZW9tX3BvaW50KGRhdGEgPSBwcF8yMC4ycHAubGFnLmNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG0pLCBzaXplID0gMiwgYWxwaGEgPSAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLCAiYmFzYWx0IiA9IGJhc2FsdCwgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICIiLCB2YWx1ZXMgPSBjKCJidWxrQyIgPSAxLCAicmVzcGlyYXRpb24iID0gMikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxOTUwLCAyMDIyKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC02MCwgODE1KSkgKwogICMgZ2d0aXRsZSgiV2FybSBzaXRlIDJwcyBtb2RlbCBmaXRzIikgKwogIHhsYWIoIlllYXIiKSArCiAgeWxhYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICAjIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KC45LCAiY20iKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKZ2dzYXZlKCIvVXNlcnMvamVmZi9EZXNrdG9wL3dhcm1fMnBwX2xhZ18xMF9tb2RGaXQucG5nIiwgcGxvdCA9IHBwLnAsCiAgICAgICB3aWR0aCA9IDMuMTYzLCBoZWlnaHQgPSAyLjUsIHVuaXRzID0gYygiaW4iKSkKCiMgZ2V0IHNwbGluZWQgbWluIGRhdGEKcmFzMTguc3AuZGYyIDwtIHJhczE4LnNwLmRmICU+JQogIGZpbHRlcihkZXB0aCA9PSAiMC0xMCBjbSIgfCBkZXB0aCA9PSAiMTAtMjAgY20iIHwgZGVwdGggPT0gIjIwLTMwIGNtIikgJT4lCiAgbXV0YXRlKGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KGRlcHRoLCAiICIpLCAiW1siLCAxKSwKICAgICAgICAgUE1lY28gPSBwYXN0ZTAoUE0sIEVDTykpICU+JQogIGRwbHlyOjpzZWxlY3QoYygiUE1lY28iLCAiZGVwdGgiLCAiQWxfb3giLCAiQWxfcHkiLCAiRmVfZGMiLCAiRmVfb3giKSkKCiMjIGFkZCBtaW4gZGF0YSwgVCwgbGFnIHRvIHNhLnR0LmxzCiMgMnBwCnNhLnR0LjJwcC5kZiA8LSBiaW5kX3Jvd3Moc2EudHQuMnBwLm1jbWMuZXJyLmxzLCAuaWQgPSAiUE1lY29fZGVwdGgiKSAlPiUKICBtdXRhdGUoUE1lY28gPSBzYXBwbHkoc3Ryc3BsaXQoUE1lY29fZGVwdGgsICJfIiksICJbWyIsIDEpLAogICAgICAgICBkZXB0aCA9IHNhcHBseShzdHJzcGxpdChQTWVjb19kZXB0aCwgIl8iKSwgIltbIiwgMiksCiAgICAgICAgIHBtID0gaWZlbHNlKGdyZXBsKCJBTiIsIFBNZWNvX2RlcHRoKSwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkJTIiwgUE1lY29fZGVwdGgpLCAiYmFzYWx0IiwgImdyYW5pdGUiKSksCiAgICAgICAgIGVjbyA9IGZhY3RvcigKICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIndmIiwgUE1lY29fZGVwdGgpLCAiY29vbCIsIAogICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoInJmIiwgUE1lY29fZGVwdGgpLCAiY29sZCIsICJ3YXJtIikpLCAKICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSkpICU+JQogIGxlZnRfam9pbihtYXQuZGYsIGJ5ID0gIlBNZWNvIikgJT4lCiAgbGVmdF9qb2luKHJhczE4LnNwLmRmMiwgYnkgPSBjKCJQTWVjbyIsICJkZXB0aCIpKSAlPiUKICBtdXRhdGUocGNfbWluID0gQWxfb3ggKyAuNSAqIEZlX294KQoKIyAxcC5sYWcKc2EudHQuMXAubGFnLm1jbWMuZXJyLmxzMiA8LSBsYXBwbHkoCiAgc2VxX2Fsb25nKHNhLnR0LjFwLmxhZy5tY21jLmVyci5scyksIGZ1bmN0aW9uKGkpIHsKICAgIGxhZyA8LSBsYWcuMXAubWNtYy5lcnIubHNbW2ldXVtbIm1lYW5MYWciXV0KICAgIHNhLnR0IDwtIHNhLnR0LjFwLmxhZy5tY21jLmVyci5sc1tbaV1dIAogICAgc2EudHQkbWVhblRyYW5zVF9sYWcgPC0gc2EudHQkbWVhblRyYW5zVCArIGxhZwogICAgcmV0dXJuKHNhLnR0KQogIH0pCm5hbWVzKHNhLnR0LjFwLmxhZy5tY21jLmVyci5sczIpIDwtIG5hbWVzKHNhLnR0LjJwcC5sYWcubWNtYy5lcnIubHMpCgojIDJwcC5sYWcKc2EudHQuMnBwLmxhZy5tY21jLmVyci5sczIgPC0gbGFwcGx5KAogIHNlcV9hbG9uZyhzYS50dC4ycHAubGFnLm1jbWMuZXJyLmxzKSwgZnVuY3Rpb24oaSkgewogICAgbGFnIDwtIGxhZy4ycHAubWNtYy5lcnIubHNbW2ldXVtbIm1lYW5MYWciXV0KICAgIHNhLnR0IDwtIHNhLnR0LjJwcC5sYWcubWNtYy5lcnIubHNbW2ldXSAKICAgIHNhLnR0JG1lYW5UcmFuc1RfbGFnIDwtIHNhLnR0JG1lYW5UcmFuc1QgKyBsYWcKICAgIHNhLnR0JG1lZGlhblRyYW5zVF9sYWcgPC0gc2EudHQkbWVkaWFuVHJhbnNUICsgbGFnCiAgICByZXR1cm4oc2EudHQpCiAgfSkKbmFtZXMoc2EudHQuMnBwLmxhZy5tY21jLmVyci5sczIpIDwtIG5hbWVzKHNhLnR0LjJwcC5sYWcubWNtYy5lcnIubHMpCgojIDJwcy5sYWcKc2EudHQuMnBzLmxhZy5tY21jLmVyci5sczIgPC0gbGFwcGx5KAogIHNlcV9hbG9uZyhzYS50dC4ycHMubGFnLm1jbWMuZXJyLmxzKSwgZnVuY3Rpb24oaSkgewogICAgbGFnIDwtIGxhZy4ycHMubWNtYy5lcnIubHNbW2ldXVtbIm1lYW5MYWciXV0KICAgIHNhLnR0IDwtIHNhLnR0LjJwcy5sYWcubWNtYy5lcnIubHNbW2ldXSAKICAgIHNhLnR0JG1lYW5UcmFuc1RfbGFnIDwtIHNhLnR0JG1lYW5UcmFuc1QgKyBsYWcKICAgIHJldHVybihzYS50dCkKICB9KQpuYW1lcyhzYS50dC4ycHMubGFnLm1jbWMuZXJyLmxzMikgPC0gbmFtZXMoc2EudHQuMnBzLmxhZy5tY21jLmVyci5scykKCnNhLnR0LmFpYy5kZiA8LSBtZXJnZSgKICBhaWMuaS5sYWcuYmVzdC5kZlsgLCBjKCJtb2QiLCAiUE1lY29fZGVwdGgiKV0sIAogIHJiaW5kKGJpbmRfcm93cyhzYS50dC4xcC5sYWcubWNtYy5lcnIubHMyLCAuaWQgPSAiUE1lY29fZGVwdGgiKSwgCiAgICAgICAgYmluZF9yb3dzKHNhLnR0LjJwcC5sYWcubWNtYy5lcnIubHMyLCAuaWQgPSAiUE1lY29fZGVwdGgiKSwKICAgICAgICBiaW5kX3Jvd3Moc2EudHQuMnBzLmxhZy5tY21jLmVyci5sczIsIC5pZCA9ICJQTWVjb19kZXB0aCIpKSwKICBieS54ID0gYygibW9kIiwgIlBNZWNvX2RlcHRoIikpICU+JQogIG11dGF0ZShQTWVjb19kZXB0aCA9IGFzLmNoYXJhY3RlcihQTWVjb19kZXB0aCkpICU+JQogIG11dGF0ZShQTWVjbyA9IHNhcHBseShzdHJzcGxpdChQTWVjb19kZXB0aCwgIl8iKSwgIltbIiwgMSksCiAgICAgICAgIGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KFBNZWNvX2RlcHRoLCAiXyIpLCAiW1siLCAyKSwKICAgICAgICAgcG0gPSBpZmVsc2UoZ3JlcGwoIkFOIiwgUE1lY29fZGVwdGgpLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQlMiLCBQTWVjb19kZXB0aCksICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgZWNvID0gZmFjdG9yKAogICAgICAgICAgIGlmZWxzZShncmVwbCgid2YiLCBQTWVjb19kZXB0aCksICJjb29sIiwgCiAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgicmYiLCBQTWVjb19kZXB0aCksICJjb2xkIiwgIndhcm0iKSksIAogICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSkgJT4lCiAgbGVmdF9qb2luKG1hdC5kZiwgYnkgPSAiUE1lY28iKSAlPiUKICBsZWZ0X2pvaW4ocmFzMTguc3AuZGYyLCBieSA9IGMoIlBNZWNvIiwgImRlcHRoIikpICU+JQogIG11dGF0ZShwY19taW4gPSBBbF9veCArIC41ICogRmVfb3gpCgpzYS5kZW5zLmRmIDwtIGJpbmRfcm93cyhzYS50dC4ycHAubGFnLm1jbWMuZXJyLmxzMiwgLmlkID0gIlBNZWNvX2RlcHRoIikgJT4lCiAgbXV0YXRlKFBNZWNvID0gc2FwcGx5KHN0cnNwbGl0KFBNZWNvX2RlcHRoLCAiXyIpLCAiW1siLCAxKSwKICAgICAgICAgZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoUE1lY29fZGVwdGgsICJfIiksICJbWyIsIDIpLAogICAgICAgICBwbSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjb19kZXB0aCksICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvX2RlcHRoKSwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICBlY28gPSBmYWN0b3IoCiAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3ZiIsIFBNZWNvX2RlcHRoKSwgImNvb2wiLCAKICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJyZiIsIFBNZWNvX2RlcHRoKSwgImNvbGQiLCAid2FybSIpKSwgCiAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpKSAlPiUKICBsZWZ0X2pvaW4obWF0LmRmLCBieSA9ICJQTWVjbyIpICU+JQogIGxlZnRfam9pbihyYXMxOC5zcC5kZjIsIGJ5ID0gYygiUE1lY28iLCAiZGVwdGgiKSkgJT4lCiAgbXV0YXRlKG94X21pbiA9IEFsX294ICsgLjUgKiBGZV9veCwKICAgICAgICAgcGNfbWluID0gRmVfZGMgLSBGZV9veCkKCnNhLnR0LnBsb3QuZnggPC0gZnVuY3Rpb24oZGYsIFBNZWNvX2RlcHRoX2ZpbHRlciA9IE5VTEwsIGRlcHRoX2ZpbHRlciA9IE5VTEwsIHhfdmFyLCB5X3ZhciwgeV9zZCwgY29sb3IpIHsKICAKICAjIGRlZmluZSB4eSwgY29sb3IKICB4X3N5bSA8LSBzeW0oeF92YXIpCiAgeV9zeW0gPC0gc3ltKHlfdmFyKQogIHlfc2Rfc3ltIDwtIHN5bSh5X3NkKQogIGNvbF9zeW0gPC0gc3ltKGNvbG9yKQogIAogICMgc2V0IGVyciBiYXIgd2lkdGgKICBpZiAoeF92YXIgPT0gIk1BVCIpIHsKICAgIHcgPC0gLjE1CiAgfSBlbHNlIHsKICAgIHcgPC0gLjgKICB9CiAgCiAgaWYgKGNvbG9yID09ICJlY28iKSB7CiAgICBjX3ZhbHMgPC0gYygid2FybSIgPSB3YXJtLCAiY29vbCIgPSBjb29sLCAiY29sZCIgPSBjb2xkKQogICAgc2hwX3N5bSA8LSBzeW0oInBtIikKICAgIHNfdmFscyA8LSBjKCJhbmRlc2l0ZSIgPSAxNSwgImJhc2FsdCIgPSAxNiwgImdyYW5pdGUiID0gMTcpIAogIH0gZWxzZSB7CiAgICBjX3ZhbHMgPC0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsICJiYXNhbHQiID0gYmFzYWx0LCAiZ3Jhbml0ZSIgPSBncmFuaXRlKQogICAgc2hwX3N5bSA8LSBzeW0oImVjbyIpCiAgICBzX3ZhbHMgPC0gYygid2FybSIgPSAxNSwgImNvb2wiID0gMTYsICJjb2xkIiA9IDE3KSAKICB9CiAgCiAgIyBmaWx0ZXIKICBpZiAoIWlzLm51bGwoUE1lY29fZGVwdGhfZmlsdGVyKSkgewogICAgZGYgPC0gZGYgJT4lCiAgICAgIGZpbHRlcihQTWVjb19kZXB0aCAhPSBQTWVjb19kZXB0aF9maWx0ZXIpIAogIH0KICBpZiAoIWlzLm51bGwoZGVwdGhfZmlsdGVyKSkgewogICAgZGYgPC0gZGYgJT4lCiAgICAgIGZpbHRlcihkZXB0aCA9PSBkZXB0aF9maWx0ZXIpIAogIH0KICAKICAjIHBsb3QKICBwIDwtIGRmICU+JQogICAgZ2dwbG90KC4sIGFlcyghISB4X3N5bSwgISEgeV9zeW0sIGNvbG9yID0gISEgY29sX3N5bSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gISEgc2hwX3N5bSksIHNpemUgPSAzKSArCiAgICAjIGdlb21fbGluZSgpICsKICAgIGdlb21fZXJyb3JiYXIoCiAgICAgIGFlcyh5bWluID0gISEgeV9zeW0gLSAhISB5X3NkX3N5bSwgeW1heCA9ICEhIHlfc3ltICsgISEgeV9zZF9zeW0pLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB3KSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICIiLCB2YWx1ZXMgPSBjX3ZhbHMpICsKICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IHNfdmFscykgKwogICAgeGxhYigiIikgKwogICAgeWxhYigiIikgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKICBpZiAoaXMubnVsbChkZXB0aF9maWx0ZXIpKSB7CiAgICBwIDwtIHAgKyAKICAgICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhkZXB0aCkpCiAgfQogIAogICMgaWYgKHlfdmFyID09ICJtZWFuQWdlIikgewogICMgICBwIDwtIHAgKwogICMgICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNTEwLCAxMDApLCBsaW1pdHMgPSBjKDAsIDUxMCkpCiAgIyB9CiAgCiAgIyBpZiAoeWxhYikgewogICMgICBwICsgCiAgIyAgICAgeWxhYih5bGFiKQogICMgfQogIHAKfQoKIyBwbG90IFNBICYgVFQgdnMgQWwgb3ggKDAtMTApCnNhLmFsb3guMTAucCA8LSBzYS50dC5wbG90LmZ4KAogIHNhLmRlbnMuZGYsIAogIGRlcHRoX2ZpbHRlciA9ICIwLTEwIiwKICB4X3ZhciA9ICJBbF9veCIsIAogIHlfdmFyID0gIm1lYW5BZ2UiLCAKICB5X3NkID0gImFnZV9zZCIsIAogIGNvbG9yID0gImVjbyIpICsgCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKc2Eub3htaW4uMTAucCA8LSBzYS50dC5wbG90LmZ4KAogIHNhLmRlbnMuZGYsIAogIGRlcHRoX2ZpbHRlciA9ICIwLTEwIiwKICB4X3ZhciA9ICJveF9taW4iLCAKICB5X3ZhciA9ICJtZWFuQWdlIiwgCiAgeV9zZCA9ICJtZWFuQWdlU0QiLCAKICBjb2xvciA9ICJlY28iKSArIAogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCnR0Lm94bWluLjEwLnAgPC0gc2EudHQucGxvdC5meCgKICBzYS5kZW5zLmRmLCAKICBkZXB0aF9maWx0ZXIgPSAiMC0xMCIsCiAgeF92YXIgPSAib3hfbWluIiwgCiAgeV92YXIgPSAibWVhblRyYW5zVCIsIAogIHlfc2QgPSAibWVhblRUU0QiLCAKICBjb2xvciA9ICJlY28iKSArIAogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCnR0Lm94bWluLjEwLnAyIDwtIHNhLnR0LnBsb3QuZngoCiAgc2EuZGVucy5kZiwgCiAgZGVwdGhfZmlsdGVyID0gIjAtMTAiLAogIHhfdmFyID0gIm94X21pbiIsIAogIHlfdmFyID0gIm1lZGlhblRyYW5zVCIsIAogIHlfc2QgPSAibWVkaWFuVFRTRCIsIAogIGNvbG9yID0gImVjbyIpICsgCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKdHQuYWxveC4xMC5ub2xhZy5wIDwtIHNhLnR0LnBsb3QuZngoCiAgc2EudHQuMnBwLmRmLCAKICBkZXB0aF9maWx0ZXIgPSAiMC0xMCIsCiAgeF92YXIgPSAiQWxfb3giLCAKICB5X3ZhciA9ICJtZWFuVHJhbnNUIiwgCiAgeV9zZCA9ICJ0dF9zZCIsIAogIGNvbG9yID0gImVjbyIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyMjApKSArCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKCgojIHBsb3QgU0EgJiBUVCB2cyBNQVQgKDAtMTApCnNhLm1hdC4xMC5wIDwtIHNhLnR0LnBsb3QuZngoCiAgc2EuZGVucy5kZiwgCiAgZGVwdGhfZmlsdGVyID0gIjAtMTAiLCAKICB4X3ZhciA9ICJNQVQiLCAKICB5X3ZhciA9ICJtZWFuQWdlIiwgCiAgeV9zZCA9ICJtZWFuQWdlU0QiLCAKICBjb2xvciA9ICJwbSIpICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQpzYS5tYXQuMTAucCA8LSBzYS50dC5wbG90LmZ4KAogIHNhLnR0LmFpYy5kZiwgCiAgZGVwdGhfZmlsdGVyID0gIjAtMTAiLCAKICB4X3ZhciA9ICJNQVQiLCAKICB5X3ZhciA9ICJtZWFuQWdlIiwgCiAgeV9zZCA9ICJhZ2Vfc2QiLCAKICBjb2xvciA9ICJwbSIpICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQpzYS5tYXQuMTAucDIgPC0gc2EudHQucGxvdC5meCgKICBzYS5kZW5zLmRmLCAKICBkZXB0aF9maWx0ZXIgPSAiMC0xMCIsCiAgeF92YXIgPSAiTUFUIiwgCiAgeV92YXIgPSAibWVkaWFuQWdlIiwgCiAgeV9zZCA9ICJtZWRpYW5BZ2VTRCIsIAogIGNvbG9yID0gInBtIikgKyAKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQp0dC5tYXQuMTAucCA8LSBzYS50dC5wbG90LmZ4KAogIHNhLnR0LmFpYy5kZiwgCiAgZGVwdGhfZmlsdGVyID0gIjAtMTAiLAogIHhfdmFyID0gIk1BVCIsIAogIHlfdmFyID0gIm1lYW5UcmFuc1RfbGFnIiwgCiAgeV9zZCA9ICJtZWFuVFRTRCIsIAogIGNvbG9yID0gInBtIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDI3NSkpICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQp0dC5tYXQuMTAucCA8LSBzYS50dC5wbG90LmZ4KAogIHNhLmRlbnMuZGYsIAogIGRlcHRoX2ZpbHRlciA9ICIwLTEwIiwKICB4X3ZhciA9ICJNQVQiLCAKICB5X3ZhciA9ICJtZWFuVHJhbnNUX2xhZyIsIAogIHlfc2QgPSAibWVhblRUU0QiLCAKICBjb2xvciA9ICJwbSIpICsKICAjIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDIyMCkpICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQp0dC5tYXQuMTAucDIgPC0gc2EudHQucGxvdC5meCgKICBzYS5kZW5zLmRmLCAKICBkZXB0aF9maWx0ZXIgPSAiMC0xMCIsCiAgeF92YXIgPSAiTUFUIiwgCiAgeV92YXIgPSAibWVkaWFuVHJhbnNUIiwgCiAgeV9zZCA9ICJtZWRpYW5UVFNEIiwgCiAgY29sb3IgPSAicG0iKSArIAogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCnR0Lm1hdC4xMC5ub2xhZy5wIDwtIHNhLnR0LnBsb3QuZngoCiAgc2EudHQuMnBwLmRmLCAKICBkZXB0aF9maWx0ZXIgPSAiMC0xMCIsCiAgeF92YXIgPSAiTUFUIiwgCiAgeV92YXIgPSAibWVhblRyYW5zVCIsIAogIHlfc2QgPSAidHRfc2QiLCAKICBjb2xvciA9ICJwbSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyMjApKSArCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKCgojIHBsb3QgU0EgJiBUVCB2cyBBbCBveCAoMjAtMzApCnNhLm94bWluLjMwLnAgPC0gc2EudHQucGxvdC5meCgKICBzYS5kZW5zLmRmLCAKICBQTWVjb19kZXB0aF9maWx0ZXIgPSAiQlN3Zl8yMC0zMCIsCiAgZGVwdGhfZmlsdGVyID0gIjIwLTMwIiwKICB4X3ZhciA9ICJveF9taW4iLCAKICB5X3ZhciA9ICJtZWFuQWdlIiwgCiAgeV9zZCA9ICJtZWFuQWdlU0QiLCAKICBjb2xvciA9ICJlY28iKSArCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKdHQuYWxveC4zMC5wIDwtIHNhLnR0LnBsb3QuZngoCiAgc2EuZGVucy5kZiwgCiAgUE1lY29fZGVwdGhfZmlsdGVyID0gIkJTd2ZfMjAtMzAiLCAKICBkZXB0aF9maWx0ZXIgPSAiMjAtMzAiLAogIHhfdmFyID0gIkFsX294IiwgCiAgeV92YXIgPSAibWVkaWFuVHJhbnNUIiwgCiAgeV9zZCA9ICJtZWRpYW5UVFNEIiwgCiAgY29sb3IgPSAiZWNvIikgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCgojIHBsb3QgU0EgJiBUVCB2cyBNQVQgKDIwLTMwKQpzYS5tYXQuMzAucCA8LSBzYS50dC5wbG90LmZ4KAogIHNhLmRlbnMuZGYsIAogIFBNZWNvX2RlcHRoX2ZpbHRlciA9ICJCU3dmXzIwLTMwIiwgCiAgZGVwdGhfZmlsdGVyID0gIjIwLTMwIiwgCiAgeF92YXIgPSAiTUFUIiwgCiAgeV92YXIgPSAibWVhbkFnZSIsIAogIHlfc2QgPSAiYWdlX3NkIiwgCiAgY29sb3IgPSAicG0iKSArCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKdHQubWF0LjMwLnAgPC0gc2EudHQucGxvdC5meCgKICBzYS5kZW5zLmRmLCAgIAogIFBNZWNvX2RlcHRoX2ZpbHRlciA9ICJCU3dmXzIwLTMwIiwgCiAgZGVwdGhfZmlsdGVyID0gIjIwLTMwIiwKICB4X3ZhciA9ICJNQVQiLCAKICB5X3ZhciA9ICJtZWFuVHJhbnNUIiwgCiAgeV9zZCA9ICJ0dF9zZCIsIAogIGNvbG9yID0gInBtIikgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCgojIHNhLmFsb3guMTAucAojIHNhLmFsb3guMzAucAojIHNhLm1hdC4xMC5wCiMgc2EubWF0LjMwLnAKIyAKIyB0dC5hbG94LjEwLnAKIyB0dC5hbG94LjMwLnAKIyB0dC5tYXQuMTAucAojIHR0Lm1hdC4zMC5wCgpnZ3NhdmUoIi9Vc2Vycy9qZWZmL0RvY3VtZW50cy9Qb3N0RG9jL0V4ZXRlci9wbG90cy9zYS5hbG94LjEwLnAucG5nIiwgCiAgICAgICBwbG90ID0gc2EuYWxveC4xMC5wLAogICAgICAgd2lkdGggPSA1LCBoZWlnaHQgPSAzLjUsIHVuaXRzID0gYygiaW4iKSkKZ2dzYXZlKCIvVXNlcnMvamVmZi9Eb2N1bWVudHMvUG9zdERvYy9FeGV0ZXIvcGxvdHMvdHQuYWxveC4xMC5wLnBuZyIsIAogICAgICAgcGxvdCA9IHR0LmFsb3guMTAucCwKICAgICAgIHdpZHRoID0gNSwgaGVpZ2h0ID0gMy41LCB1bml0cyA9IGMoImluIikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvRG9jdW1lbnRzL1Bvc3REb2MvRXhldGVyL3Bsb3RzL3NhLmFsb3guMzAucC5wbmciLCAKICAgICAgIHBsb3QgPSBzYS5hbG94LjMwLnAsCiAgICAgICB3aWR0aCA9IDUsIGhlaWdodCA9IDMuNSwgdW5pdHMgPSBjKCJpbiIpKQpnZ3NhdmUoIi9Vc2Vycy9qZWZmL0RvY3VtZW50cy9Qb3N0RG9jL0V4ZXRlci9wbG90cy9zYS5tYXQuMTAucC5wbmciLCAKICAgICAgIHBsb3QgPSBzYS5tYXQuMTAucCwKICAgICAgIHdpZHRoID0gNS4yLCBoZWlnaHQgPSAzLjUsIHVuaXRzID0gYygiaW4iKSkKZ2dzYXZlKCIvVXNlcnMvamVmZi9Eb2N1bWVudHMvUG9zdERvYy9FeGV0ZXIvcGxvdHMvdHQubWF0LjEwLnAucG5nIiwgCiAgICAgICBwbG90ID0gdHQubWF0LjEwLnAsCiAgICAgICB3aWR0aCA9IDUuMiwgaGVpZ2h0ID0gMy41LCB1bml0cyA9IGMoImluIikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvRG9jdW1lbnRzL1Bvc3REb2MvRXhldGVyL3Bsb3RzL3NhLm1hdC4zMC5wLnBuZyIsIAogICAgICAgcGxvdCA9IHNhLm1hdC4zMC5wLAogICAgICAgd2lkdGggPSA1LjIsIGhlaWdodCA9IDMuNSwgdW5pdHMgPSBjKCJpbiIpKQoKZ2dzYXZlKCIvVXNlcnMvamVmZi9uZXh0Q2xvdWQvRG9jdW1lbnRzL1Bvc3RlcnMgYW5kIHRhbGtzL0NvbmZlcmVuY2VzL0FHVV8yMDIyL3NhLnBjbS4xMC5wLnBuZyIsIAogICAgICAgcGxvdCA9IHNhLnBjbS4xMC5wLAogICAgICAgd2lkdGggPSA1LjIsIGhlaWdodCA9IDMuNSwgdW5pdHMgPSBjKCJpbiIpKQpnZ3NhdmUoIi9Vc2Vycy9qZWZmL25leHRDbG91ZC9Eb2N1bWVudHMvUG9zdGVycyBhbmQgdGFsa3MvQ29uZmVyZW5jZXMvQUdVXzIwMjIvdHQucGNtLjEwLnAucG5nIiwgCiAgICAgICBwbG90ID0gdHQucGNtLjEwLnAsCiAgICAgICB3aWR0aCA9IDUuMiwgaGVpZ2h0ID0gMy41LCB1bml0cyA9IGMoImluIikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvbmV4dENsb3VkL0RvY3VtZW50cy9Qb3N0ZXJzIGFuZCB0YWxrcy9Db25mZXJlbmNlcy9BR1VfMjAyMi9zYS5tYXQuMTAucC5wbmciLCAKICAgICAgIHBsb3QgPSBzYS5tYXQuMTAucCwKICAgICAgIHdpZHRoID0gNS4yLCBoZWlnaHQgPSAzLjUsIHVuaXRzID0gYygiaW4iKSkKZ2dzYXZlKCIvVXNlcnMvamVmZi9uZXh0Q2xvdWQvRG9jdW1lbnRzL1Bvc3RlcnMgYW5kIHRhbGtzL0NvbmZlcmVuY2VzL0FHVV8yMDIyL3R0Lm1hdC4xMC5wLnBuZyIsIAogICAgICAgcGxvdCA9IHR0Lm1hdC4xMC5wLAogICAgICAgd2lkdGggPSA1LjIsIGhlaWdodCA9IDMuNSwgdW5pdHMgPSBjKCJpbiIpKQoKc2Eub3htaW4uMTAucApzYS5veG1pbi4xMC5wMgpzYS5tYXQuMTAucApzYS5tYXQuMTAucDIKdHQubWF0LjEwLnAKdHQubWF0LjEwLnAyCnR0Lm94bWluLjEwLnAKdHQub3htaW4uMTAucDIKYGBgCgpgYGB7ciBhZ3UtcGxvdHN9CnNhLm1lYW4ubWF0LmJzZ3IuMTAucCA8LSBzYS5kZW5zLmRmICU+JQogIGZpbHRlcihkZXB0aCA9PSAiMC0xMCIpICU+JQogIGZpbHRlcihwbSAhPSAiYW5kZXNpdGUiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKE1BVCwgbWVhbkFnZSwgY29sb3IgPSBwbSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IG1lYW5BZ2UgLSBtZWFuQWdlU0QsIHltYXggPSAgbWVhbkFnZSArIG1lYW5BZ2VTRCksIAogICAgd2lkdGggPSAuMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIiIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoNiwgMTMuMykpICsKICB4bGFiKCIiKSArCiAgeWxhYigiIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKc2EubWVhbi5tYXQuMTAucCA8LSBzYS5kZW5zLmRmICU+JQogIGZpbHRlcihkZXB0aCA9PSAiMC0xMCIpICU+JQogIGdncGxvdCguLCBhZXMoTUFULCBtZWFuQWdlLCBjb2xvciA9IHBtKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gbWVhbkFnZSAtIG1lYW5BZ2VTRCwgeW1heCA9ICBtZWFuQWdlICsgbWVhbkFnZVNEKSwKICAgIHdpZHRoID0gLjIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICIiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDYsIDEzLjMpKSArCiAgeGxhYigiIikgKwogIHlsYWIoIiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCiAKIyBtaW5lcmFscwpzYS5tZWFuLm94bWluLnB0cy4zMC5wIDwtIHNhLmRlbnMuZGYgJT4lCiAgZmlsdGVyKGRlcHRoID09ICIyMC0zMCIpICU+JSAKICBmaWx0ZXIoUE1lY29fZGVwdGggIT0gIkJTd2ZfMjAtMzAiKSAlPiUgCiAgZ2dwbG90KC4sIGFlcyhveF9taW4sIG1lYW5BZ2UsIGNvbG9yID0gZWNvKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gcG0pLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IG1lYW5BZ2UgLSBtZWFuQWdlU0QsIHltYXggPSAgbWVhbkFnZSArIG1lYW5BZ2VTRCksIAogICAgICAgICAgICAgICAgd2lkdGggPSAuNikgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIiIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gMTYpKSArCiBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICIiLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gd2FybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IGNvb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSBjb2xkKSkgKwogIHhsYWIoIiIpICsKICB5bGFiKCIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQp0dC5tZWFuLm94bWluLnB0cy4yMC5wIDwtIHNhLmRlbnMuZGYgJT4lCiAgZmlsdGVyKGRlcHRoID09ICIxMC0yMCIpICU+JQogIGZpbHRlcihQTWVjb19kZXB0aCAhPSAiR1JyZl8xMC0yMCIgJiBQTWVjb19kZXB0aCAhPSAiQlN3Zl8xMC0yMCIpICU+JQogIGdncGxvdCguLCBhZXMob3hfbWluLCBtZWFuVHJhbnNUX2xhZywgY29sb3IgPSBlY28pKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBwbSksIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gbWVhblRyYW5zVF9sYWcgLSBtZWFuVFRTRCwgeW1heCA9ICBtZWFuVHJhbnNUX2xhZyArIG1lYW5UVFNEKSwgCiAgICAgICAgICAgICAgICB3aWR0aCA9IC42KSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAxNikpICsKIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIiIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSB3YXJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gY29vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IGNvbGQpKSArCiAgeGxhYigiIikgKwogIHlsYWIoIiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCnR0Lm1lYW4ubWF0Lmxucy4xMC5wIDwtIHNhLmRlbnMuZGYgJT4lCiAgZmlsdGVyKGRlcHRoID09ICIwLTEwIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhNQVQsIG1lYW5UcmFuc1QsIGNvbG9yID0gcG0pKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fbGluZSgpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBtZWFuVHJhbnNUIC0gbWVhblRUU0QsIHltYXggPSAgbWVhblRyYW5zVCArIG1lYW5UVFNEKSwgCiAgICAgICAgICAgICAgICB3aWR0aCA9IC4yKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICB4bGFiKCIiKSArCiAgeWxhYigiIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKCiMgZXhhbXBsZSB0cyBtb2QgCkFOcmZfMTAuMnBwLmxhZy5wIDwtIHNpbmdsZU1vZC5maXQucGxvdC5meCgKICBtb2QuZml0dGVkLjJwcC5sYWcubWNtY1siQU5yZl8wLTEwIl0sICIycHAsIGxhZywgTUNNQyIpW1sxXV0KCmdnc2F2ZSgiL1VzZXJzL2plZmYvbmV4dENsb3VkL0RvY3VtZW50cy9Qb3N0ZXJzIGFuZCB0YWxrcy9Db25mZXJlbmNlcy9BR1VfMjAyMi9BTnJmXzEwLjJwcC5sYWcucC5wbmciLCAKICAgICAgIHBsb3QgPSBBTnJmXzEwLjJwcC5sYWcucCwKICAgICAgIHdpZHRoID0gNS4yLCBoZWlnaHQgPSAzLjUsIHVuaXRzID0gYygiaW4iKSkKZ2dzYXZlKCIvVXNlcnMvamVmZi9uZXh0Q2xvdWQvRG9jdW1lbnRzL1Bvc3RlcnMgYW5kIHRhbGtzL0NvbmZlcmVuY2VzL0FHVV8yMDIyL3NhLm1lYW4ubWF0LmJzZ3IuMTAucC5wbmciLCAKICAgICAgIHBsb3QgPSBzYS5tZWFuLm1hdC5ic2dyLjEwLnAsCiAgICAgICB3aWR0aCA9IDUuMiwgaGVpZ2h0ID0gMy41LCB1bml0cyA9IGMoImluIikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvbmV4dENsb3VkL0RvY3VtZW50cy9Qb3N0ZXJzIGFuZCB0YWxrcy9Db25mZXJlbmNlcy9BR1VfMjAyMi9zYS5tZWFuLm1hdC4xMC5wLnBuZyIsIAogICAgICAgcGxvdCA9IHNhLm1lYW4ubWF0LjEwLnAsCiAgICAgICB3aWR0aCA9IDUuMiwgaGVpZ2h0ID0gMy41LCB1bml0cyA9IGMoImluIikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvbmV4dENsb3VkL0RvY3VtZW50cy9Qb3N0ZXJzIGFuZCB0YWxrcy9Db25mZXJlbmNlcy9BR1VfMjAyMi9zYS5tZWFuLm94bWluLnB0cy4zMC5wLnBuZyIsIAogICAgICAgcGxvdCA9IHNhLm1lYW4ub3htaW4ucHRzLjMwLnAsCiAgICAgICB3aWR0aCA9IDUuMiwgaGVpZ2h0ID0gMy41LCB1bml0cyA9IGMoImluIikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvbmV4dENsb3VkL0RvY3VtZW50cy9Qb3N0ZXJzIGFuZCB0YWxrcy9Db25mZXJlbmNlcy9BR1VfMjAyMi90dC5tZWFuLm94bWluLnB0cy4yMC5wLnBuZyIsIAogICAgICAgcGxvdCA9IHR0Lm1lYW4ub3htaW4ucHRzLjIwLnAsCiAgICAgICB3aWR0aCA9IDUuMiwgaGVpZ2h0ID0gMy41LCB1bml0cyA9IGMoImluIikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvbmV4dENsb3VkL0RvY3VtZW50cy9Qb3N0ZXJzIGFuZCB0YWxrcy9Db25mZXJlbmNlcy9BR1VfMjAyMi90dC5tZWFuLm1hdC5sbnMuMTAucC5wbmciLCAKICAgICAgIHBsb3QgPSB0dC5tZWFuLm1hdC5sbnMuMTAucCwKICAgICAgIHdpZHRoID0gNS4yLCBoZWlnaHQgPSAzLjUsIHVuaXRzID0gYygiaW4iKSkKYGBgCgpgYGB7ciBpbXBycy1wbG90c30KaXguaW1wcnMgPC0gYygzLCA2LCA5LCAyLCA1LCA4KQpzYS50dC4ycHAuaW1wcnMubHMgPC0gbGFwcGx5KGJheWVzX2ZpdF8ycHBfMF8xMFtpeC5pbXByc10sIGZ1bmN0aW9uKHgpIHsKICBBIDwtIC1kaWFnKHgkYmVzdHBhclsxOjJdKQogIEluIDwtIGMoeCRiZXN0cGFyWzNdLCAxIC0geCRiZXN0cGFyWzNdKQogIGEgPC0gc2VxKDEsIDUwMCkKICBzYSA8LSBzeXN0ZW1BZ2UoQSA9IEEsIHUgPSBJbiwgYSA9IGEpCiAgdHQgPC0gdHJhbnNpdFRpbWUoQSA9IEEsIHUgPSBJbikKICBsaXN0KHNhLCB0dCkKfSkKc2EuMnBwLmltcHJzLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoc2EudHQuMnBwLmltcHJzLmxzLCBmdW5jdGlvbih4KSB7CiAgc2EgPC0geFtbMV1dW1sibWVhblN5c3RlbUFnZSJdXQogIHR0IDwtIHhbWzJdXVtbIm1lYW5UcmFuc2l0VGltZSJdXQogIGRhdGEuZnJhbWUoYWdlID0gc2EsIHR0ID0gdHQpCn0pLCAuaWQgPSAiUE1lY29fZGVwdGgiKSAlPiUKICBtdXRhdGUocG0gPSBpZmVsc2UoZ3JlcGwoIkFOIiwgUE1lY29fZGVwdGgpLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQlMiLCBQTWVjb19kZXB0aCksICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShncmVwbCgid2YiLCBQTWVjb19kZXB0aCksICJjb29sIiwgImNvbGQiKSwgbGV2ZWxzID0gYygiY29vbCIsICJjb2xkIikpKQoKIyBzYS5tY21jLjJwcC5pbXBycyA8LSBsYXBwbHkoYmF5ZXNfZml0XzJwcF8wXzEwW2l4LmltcHJzXSwgZnVuY3Rpb24oeCkgewojICAgaXggPC0gc2FtcGxlKG5yb3coeCRwYXJzKSwgMjAwKQojICAgcGFycyA8LSB4JHBhcnNbaXgsIF0KIyAgIGFnZXMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChpeCkpCiMgICBmb3IgKGkgaW4gMTpucm93KHBhcnMpKSB7CiMgICAgIEEgPC0gLWRpYWcocGFyc1tpLCAxOjJdKQojICAgICBJbiA8LSBjKDEgKiBwYXJzW2ksIDNdLCAxICogKDEgLSBwYXJzW2ksIDNdKSkKIyAgICAgYWdlc1tbaV1dIDwtIHN5c3RlbUFnZShBID0gQSwgdSA9IEluKQojICAgfQojICAgcmV0dXJuKGFnZXMpCiMgfSkKIyBzYS5tZWFuQWdlLjJwcC5pbXBycyA8LSBsYXBwbHkoc2EubWNtYy4ycHAuaW1wcnMsIGZ1bmN0aW9uKHgpIHVubGlzdChsYXBwbHkoeCwgIltbIiwgIm1lYW5TeXN0ZW1BZ2UiKSkpCgpzYS5kZW5zLmRmLmZ4IDwtIGZ1bmN0aW9uKHNhLmxzKSB7CiAgbHMgPC0gbGFwcGx5KHNhLnR0LjJwcC5pbXBycy5scywgZnVuY3Rpb24oeCkgeFtbMV1dW1sic3lzdGVtQWdlRGVuc2l0eSJdXSkKICBhcnIgPC0gYmluZF9jb2xzKGxzKQogIGRmIDwtIGRhdGEuZnJhbWUoUE1lY29fZGVwdGggPSByZXAoZGltbmFtZXMoYXJyKVtbMl1dLCBlYWNoID0gbnJvdyhhcnIpKSwKICAgICAgICAgICAgICAgICAgIGFnZXMgPSByZXAoc2VxKDEsIG5yb3coYXJyKSksIG5jb2woYXJyKSksCiAgICAgICAgICAgICAgICAgICBkZW5zID0gdW5saXN0KGxzKSkKICBkZiAlPiUKICAgIG11dGF0ZShwbSA9IGlmZWxzZShncmVwbCgiQU4iLCBQTWVjb19kZXB0aCksICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvX2RlcHRoKSwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoIndmIiwgUE1lY29fZGVwdGgpLCAiY29vbCIsICJjb2xkIiksIGxldmVscyA9IGMoImNvb2wiLCAiY29sZCIpKSkKfQpzYS5kZW5zLmRmIDwtIHNhLmRlbnMuZGYuZngoc2EudHQuMnBwLmltcHJzLmxzKQpmX2xhYnMgPC0gZGF0YS5mcmFtZShhZ2VzID0gMjIwLCBkZW5zID0gMC4wMTQsIGVjbyA9IGMoImNvb2wiLCAiY29sZCIpKQpmX2xhYnMkbGFiZWwgPC0gcGFzdGUwKGxldHRlcnNbMToyXSwgIikgIiwgZl9sYWJzJGVjbykKc2EucCA8LSBnZ3Bsb3Qoc2EuZGVucy5kZiwgYWVzKGFnZXMsIGRlbnMpKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBtKSwgc2l6ZSA9IDEuMikgKwogIGdlb21fdmxpbmUoZGF0YSA9IHNhLjJwcC5pbXBycy5kZiwgYWVzKHhpbnRlcmNlcHQgPSBhZ2UsIGNvbG9yID0gcG0pLAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3RleHQoZGF0YSA9IGZfbGFicywgYWVzKGxhYmVsID0gbGFiZWwpLAogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gLjM2ICogMjgsIGZvbnRmYWNlID0gImJvbGQiLCBoanVzdCA9ICJsZWZ0IikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiIiwKICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAxNTAsIDMwMCwgNDUwKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZWNvKSkgKwogIHhsYWIoIkFnZSIpICsKICB5bGFiKCJEZW5zaXR5IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI0KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLAogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDEuNywgImNtIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCmdnc2F2ZShmaWxlbmFtZSA9ICIvVXNlcnMvamVmZi9uZXh0Q2xvdWQvRG9jdW1lbnRzL1Bvc3RlcnMgYW5kIHRhbGtzL015IHBvc3RlcnM6dGFsa3MvSU1QUlNfUmV0cmVhdF8yMDIyL3NhLnBuZyIsCiAgICAgICBwbG90ID0gc2EucCwgaGVpZ2h0ID0gNS42NCwgd2lkdGggPSAxMywgdW5pdHMgPSAiaW4iKQpzYS5wCmBgYAoKYGBge3IgSU1QUlMtcGxvdHMtZXRjfQojIGNvbXBhcmUgYmVzdCBmaXQgcGxvdHMgZm9yIDAtMTAgKHdmLCByZikKaXgud2YgPC0gZ3JlcCgid2YiLCBuYW1lcyhtb2QuZml0dGVkLjEwLjJwcC5tY21jKSkKaXgucmYgPC0gZ3JlcCgicmYiLCBuYW1lcyhtb2QuZml0dGVkLjEwLjJwcC5tY21jKSkKd2YuMnBwLnAubHMgPC0gc2luZ2xlTW9kLmZpdC5wbG90LmZ4KHNlbnNfc3VtLjJwcC5sc1tpeC53Zl0sICIycHAsIE1DTUMiLCBzZW5zcmFuZ2UgPSBUUlVFKQpyZi4ycHAucC5scyA8LSBzaW5nbGVNb2QuZml0LnBsb3QuZngoc2Vuc19zdW0uMnBwLmxzW2l4LnJmXSwgIjJwcCwgTUNNQyIsIHNlbnNyYW5nZSA9IFRSVUUpCmxnIDwtIGdldF9sZWdlbmQoCiAgICB3Zi4ycHAucC5sc1tbMV1dICsKICAgICAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpICsKICAgICAgdGhlbWUobGVnZW5kLmJveC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMTIpLAogICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSkKcC5scyA8LSBsYXBwbHkoYyh3Zi4ycHAucC5scywgcmYuMnBwLnAubHMpLCBmdW5jdGlvbihwKSB7CiAgcCArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgdGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCn0pCnkuZ3JvYiA8LSB0ZXh0R3JvYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJyksCiAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udGZhY2UgPSAiYm9sZCIsIGZvbnRzaXplID0gMTQpLCByb3QgPSA5MCkKeC5ncm9iIDwtIHRleHRHcm9iKCJZZWFyIiwgZ3AgPSBncGFyKGZvbnRmYWNlID0gImJvbGQiLCBmb250c2l6ZSA9IDE0KSkKbGFicyA8LSBwYXN0ZTAobGV0dGVyc1sxOjZdLCAiKSIsIGMoIiBhbmRlc2l0ZSIsICIgYmFzYWx0IiwgIiBncmFuaXRlIiksIGMocmVwKCIsIGNvb2wiLCAzKSwgcmVwKCIsIGNvbGQiLCAzKSkpCnBnIDwtIGFycmFuZ2VHcm9iKAogIHBsb3RfZ3JpZChwbG90bGlzdCA9IHAubHMsIGxhYmVscyA9IGxhYnMsIGxhYmVsX3ggPSAuNCwgaGp1c3QgPSAwLCBsYWJlbF95ID0gLjk1LCBsYWJlbF9zaXplID0gOSwgbGFiZWxfZm9udGZhY2UgPSAiYm9sZCIpLAogIGxlZnQgPSB5Lmdyb2IsIGJvdHRvbSA9IHguZ3JvYikKcGxvdF9ncmlkKHBnLCBsZywgcmVsX3dpZHRocyA9IGMoNCwgMSkpCgojCnJ0LnBsb3QuZnggPC0gZnVuY3Rpb24oZml0MSwgZml0MiwgZml0MykgewogIG5tcyA8LSBsaXN0KG5hbWVzKGZpdDEpLCBuYW1lcyhmaXQyKSwgbmFtZXMoZml0MykpCiAgY29uLmRmIDwtIGRvLmNhbGwoCiAgICByYmluZCwKICAgIGxhcHBseShzZXFfYWxvbmcobm1zKSwgZnVuY3Rpb24oaSkKICAgICAgY29uLmRmLmZ4KG5tc1tbaV1dKSAlPiUKICAgICAgICBtdXRhdGUocG0gPSBpZmVsc2UoZ3JlcGwoIkFOIiwgbm1zW1tpXV0pLCAiYW5kZXNpdGUiLCBpZmVsc2UoZ3JlcGwoIkJTIiwgbm1zW1tpXV0pLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpKSkKICBwbG90LmRmIDwtIHJiaW5kKGZpdDFbWzFdXSwgZml0MltbMV1dLCBmaXQzW1sxXV0pCiAgcGxvdC5kZiRzaXRlIDwtIHJlcCh1bmxpc3Qobm1zKSwgZWFjaCA9IG5yb3coZml0MVtbMV1dKSkKICBwbG90LmRmJHBtIDwtIGlmZWxzZShncmVwbCgiQU4iLCBwbG90LmRmJHNpdGUpLCAiYW5kZXNpdGUiLCBpZmVsc2UoZ3JlcGwoIkJTIiwgcGxvdC5kZiRzaXRlKSwgImJhc2FsdCIsICJncmFuaXRlIikpCiAgYXRtIDwtIHBsb3QuZGZbd2hpY2gocGxvdC5kZiRwb29sID09ICJhdG0iKSwgXQogIHBsb3QuZGYgJT4lCiAgICBmaWx0ZXIocG9vbCA9PSAiYnVsa0MiIHwgcG9vbCA9PSAicmVzcGlyYXRpb24iKSAlPiUKICAgIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMpKSArCiAgICBnZW9tX3BhdGgoZGF0YSA9IGF0bSwgYWVzKHllYXJzLCBkMTRDKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gLjIpICsKICAgIGdlb21fcG9pbnQoZGF0YSA9IGNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG0sIHNoYXBlID0gcG9vbCksIGFscGhhID0gLjQsIHNpemUgPSAyKSArCiAgICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gcG0sIGxpbmV0eXBlID0gcG9vbCksIHNpemUgPSAxKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgIG5hbWUgPSAiIiwKICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsICJiYXNhbHQiID0gYmFzYWx0LCAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogICAgc2NhbGVfc2hhcGVfbWFudWFsKAogICAgICBuYW1lID0gIiIsCiAgICAgIHZhbHVlcyA9IGMoImJ1bGtDIiA9IDE2LCAicmVzcGlyYXRpb24iID0gMTcpKSArCiAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwoCiAgICAgIG5hbWUgPSAiIiwKICAgICAgdmFsdWVzID0gYygiYnVsa0MiID0gMSwgInJlc3BpcmF0aW9uIiA9IDIpKSArCiAgICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMTk1MCwgMjAyMiksIHlsaW0gPSBjKC03NSwgMjc1KSkgKwogICAgZ3VpZGVzKHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgxLCAiY20iKSkKfQp3Zi4ycHAucCA8LSBydC5wbG90LmZ4KG1vZC5maXR0ZWQuMTAuMnBwLm1jbWNbM10sIG1vZC5maXR0ZWQuMTAuMnBwLm1jbWNbNl0sIG1vZC5maXR0ZWQuMTAuMnBwLm1jbWNbOV0pCnJmLjJwcC5wIDwtIHJ0LnBsb3QuZngobW9kLmZpdHRlZC4xMC4ycHAubWNtY1syXSwgbW9kLmZpdHRlZC4xMC4ycHAubWNtY1s1XSwgbW9kLmZpdHRlZC4xMC4ycHAubWNtY1s4XSkKbGcgPC0gZ2V0X2xlZ2VuZCgKICAgIHdmLjJwcC5wICsKICAgICAgdGhlbWUobGVnZW5kLmJveC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMTIpLAogICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikpCnAubHMgPC0gbGFwcGx5KGxpc3Qod2YuMnBwLnAsIHJmLjJwcC5wKSwgZnVuY3Rpb24ocCkgcCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikpCnkuZ3JvYiA8LSB0ZXh0R3JvYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJyksCiAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udGZhY2UgPSAiYm9sZCIsIGZvbnRzaXplID0gMTQpLCByb3QgPSA5MCkKeC5ncm9iIDwtIHRleHRHcm9iKCJZZWFyIiwgZ3AgPSBncGFyKGZvbnRmYWNlID0gImJvbGQiLCBmb250c2l6ZSA9IDE0KSkKbGFicyA8LSBjKCJhKSBjb29sIiwgImIpIGNvbGQiKQpwZyA8LSBhcnJhbmdlR3JvYigKICBwbG90X2dyaWQocGxvdGxpc3QgPSBwLmxzLCBsYWJlbHMgPSBsYWJzLCBsYWJlbF94ID0gLjYsIGhqdXN0ID0gMCwgbGFiZWxfeSA9IC45NSwgbGFiZWxfc2l6ZSA9IDEyLCBsYWJlbF9mb250ZmFjZSA9ICJib2xkIiksIGxlZnQgPSB5Lmdyb2IsIGJvdHRvbSA9IHguZ3JvYikKcC5tb2RzIDwtIHBsb3RfZ3JpZChwZywgbGcsIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgLjIpKQpnZ3NhdmUoZmlsZW5hbWUgPSAiL1VzZXJzL2plZmYvbmV4dENsb3VkL0RvY3VtZW50cy9Qb3N0ZXJzIGFuZCB0YWxrcy9NeSBwb3N0ZXJzOnRhbGtzL0lNUFJTX1JldHJlYXRfMjAyMi9tb2RzMnBwLndmLjEwLnBuZyIsCiAgICAgICBwbG90ID0gcC5tb2RzLCBoZWlnaHQgPSA4LjI5LCB3aWR0aCA9IDE0LjI4LCB1bml0cyA9ICJpbiIpCmBgYAoKYGBge3IgaW1wcnMtcGxvdHMyfQojIHJ0LnBsb3QuZngyIDwtIGZ1bmN0aW9uKGZpdDEsIGZpdDIsIGZpdDMpIHsKIyAgIG5tcyA8LSBsaXN0KG5hbWVzKGZpdDEpLCBuYW1lcyhmaXQyKSwgbmFtZXMoZml0MykpCiMgICBjb24uZGYgPC0gZG8uY2FsbCgKIyAgICAgcmJpbmQsCiMgICAgIGxhcHBseShzZXFfYWxvbmcobm1zKSwgZnVuY3Rpb24oaSkgCiMgICAgICAgY29uLmRmLmZ4KG5tc1tbaV1dKSAlPiUgCiMgICAgICAgICBtdXRhdGUocG0gPSBpZmVsc2UoZ3JlcGwoIkFOIiwgbm1zW1tpXV0pLCAiYW5kZXNpdGUiLCBpZmVsc2UoZ3JlcGwoIkJTIiwgbm1zW1tpXV0pLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpKSkKIyAgIHBsb3QuZGYgPC0gcmJpbmQoZml0MVtbMV1dLCBmaXQyW1sxXV0sIGZpdDNbWzFdXSkKIyAgIHBsb3QuZGYkc2l0ZSA8LSByZXAodW5saXN0KG5tcyksIGVhY2ggPSBucm93KGZpdDFbWzFdXSkpCiMgICBwbG90LmRmJHBtIDwtIGlmZWxzZShncmVwbCgiQU4iLCBwbG90LmRmJHNpdGUpLCAiYW5kZXNpdGUiLCBpZmVsc2UoZ3JlcGwoIkJTIiwgcGxvdC5kZiRzaXRlKSwgImJhc2FsdCIsICJncmFuaXRlIikpCiMgICBhdG0gPC0gcGxvdC5kZlt3aGljaChwbG90LmRmJHBvb2wgPT0gImF0bSIpLCBdCiMgICBwbG90LmRmICU+JQojICAgICBmaWx0ZXIocG9vbCA9PSAiYnVsa0MiIHwgcG9vbCA9PSAicmVzcGlyYXRpb24iKSAlPiUKIyAgICAgZ2dwbG90KC4sIGFlcyh5ZWFycywgZDE0QykpICsKIyAgICAgZ2VvbV9wYXRoKGRhdGEgPSBhdG0sIGFlcyh5ZWFycywgZDE0QyksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IC4yKSArCiMgICAgIGdlb21fcG9pbnQoZGF0YSA9IGNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG0sIHNoYXBlID0gcG9vbCksIGFscGhhID0gLjQsIHNpemUgPSA0KSArCiMgICAgIGdlb21fcGF0aChhZXMoY29sb3IgPSBwbSwgbGluZXR5cGUgPSBwb29sKSwgc2l6ZSA9IDEuNSkgKwojICAgICBzY2FsZV9jb2xvcl9tYW51YWwoCiMgICAgICAgbmFtZSA9ICIiLAojICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLCAiYmFzYWx0IiA9IGJhc2FsdCwgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKIyAgICAgc2NhbGVfc2hhcGVfbWFudWFsKAojICAgICAgIG5hbWUgPSAiIiwKIyAgICAgICB2YWx1ZXMgPSBjKCJidWxrQyIgPSAxNiwgInJlc3BpcmF0aW9uIiA9IDE3KSkgKwojICAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwoCiMgICAgICAgbmFtZSA9ICIiLAojICAgICAgIHZhbHVlcyA9IGMoImJ1bGtDIiA9IDEsICJyZXNwaXJhdGlvbiIgPSAyKSkgKwojICAgICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMTk1MCwgMjAyMiksIHlsaW0gPSBjKC03NSwgMjc1KSkgKwojICAgICBndWlkZXMoc2hhcGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkgKwojICAgICB0aGVtZV9idygpICsKIyAgICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMS43LCAiY20iKSwKIyAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiMgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCkpCiMgfQojIHdmLjJwcC5wIDwtIHJ0LnBsb3QuZngyKG1vZC5maXR0ZWQuMTAuMnBwLm1jbWNbM10sIG1vZC5maXR0ZWQuMTAuMnBwLm1jbWNbNl0sIG1vZC5maXR0ZWQuMTAuMnBwLm1jbWNbOV0pCiMgcmYuMnBwLnAgPC0gcnQucGxvdC5meDIobW9kLmZpdHRlZC4xMC4ycHAubWNtY1syXSwgbW9kLmZpdHRlZC4xMC4ycHAubWNtY1s1XSwgbW9kLmZpdHRlZC4xMC4ycHAubWNtY1s4XSkKIyBsZyA8LSBnZXRfbGVnZW5kKAojICAgICB3Zi4ycHAucCArCiMgICAgICAgdGhlbWUobGVnZW5kLmJveC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMTIpLAojICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSkKIyBwLmxzIDwtIGxhcHBseShsaXN0KHdmLjJwcC5wLCByZi4ycHAucCksIGZ1bmN0aW9uKHApIHAgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKQojIHkuZ3JvYiA8LSB0ZXh0R3JvYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJyksCiMgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250ZmFjZSA9ICJib2xkIiwgZm9udHNpemUgPSAzMiksIHJvdCA9IDkwKQojIHguZ3JvYiA8LSB0ZXh0R3JvYigiWWVhciIsIGdwID0gZ3Bhcihmb250ZmFjZSA9ICJib2xkIiwgZm9udHNpemUgPSAzMikpCiMgbGFicyA8LSBjKCJhKSBjb29sIiwgImIpIGNvbGQiKQojIHBnIDwtIGFycmFuZ2VHcm9iKAojICAgcGxvdF9ncmlkKHBsb3RsaXN0ID0gcC5scywgbGFiZWxzID0gbGFicywgbGFiZWxfeCA9IC42LCBoanVzdCA9IDAsIGxhYmVsX3kgPSAuOTUsIGxhYmVsX3NpemUgPSAzMiwgbGFiZWxfZm9udGZhY2UgPSAiYm9sZCIpLCBsZWZ0ID0geS5ncm9iLCBib3R0b20gPSB4Lmdyb2IpCiMgcC5tb2RzIDwtIHBsb3RfZ3JpZChwZywgbGcsIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgLjIpKQojIG9wdGlvbnMoYml0bWFwVHlwZSA9ICJjYWlybyIpCiMgZ2dzYXZlKGZpbGVuYW1lID0gIi9Vc2Vycy9qZWZmL25leHRDbG91ZC9Eb2N1bWVudHMvUG9zdGVycyBhbmQgdGFsa3MvTXkgcG9zdGVyczp0YWxrcy9JTVBSU19SZXRyZWF0XzIwMjIvbW9kczJwcC53Zi4xMC5wbmciLCAKIyAgICAgICAgcGxvdCA9IHAubW9kcywgaGVpZ2h0ID0gOSwgd2lkdGggPSAxNywgdW5pdHMgPSAiaW4iKQojIAojIAojIHNhLnAgPC0gc2EudHQuMnAuZGYgJT4lCiMgICBmaWx0ZXIoZGVwdGggPT0gIjAtMTAiICYgRUNPICE9ICJwcCIpICU+JQojICAgZmlsdGVyKG1vZCA9PSAiMnBwIikgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKHBtLCBhZ2UsIGZpbGwgPSBwbSkpICsKIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwojICAgc2NhbGVfZmlsbF9tYW51YWwoCiMgICAgIG5hbWUgPSAiIiwKIyAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsICJiYXNhbHQiID0gYmFzYWx0LCAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwojICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhlY28pLCByb3dzID0gdmFycyhkZXB0aCksIHNjYWxlcyA9ICJmcmVlIikgKwojICAgeWxhYigiTWVhbiBzeXN0ZW0gYWdlICh5cnMpIikgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQsIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiMgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKIyAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiMgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKIyBnZ3NhdmUoZmlsZW5hbWUgPSAiL1VzZXJzL2plZmYvbmV4dENsb3VkL0RvY3VtZW50cy9Qb3N0ZXJzIGFuZCB0YWxrcy9NeSBwb3N0ZXJzOnRhbGtzL0lNUFJTX1JldHJlYXRfMjAyMi9zYS5wbmciLCAKIyAgICAgICAgcGxvdCA9IHNhLnAsIGhlaWdodCA9IDUuMSwgd2lkdGggPSA4LjYsIHVuaXRzID0gImluIikKIyAKIyAjIGNoZWNrIGRpc3RyaWJ1dGlvbnMKc2EuZGlzdC5scyA8LSBtYXBwbHkocmJpbmQsIHNhLnR0LjJwcC5sc1tpeC5pbXByc10sIFNJTVBMSUZZID0gRkFMU0UpCnNhLmRpc3QuZGYgPC0gZGF0YS5mcmFtZShQTWVjbyA9IHJlcChjKCIyIiwgIlppbW1lcm1hbiIpLCBlYWNoID0gbGVuZ3RoKGFnZXMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIEFnZSA9IHJlcChhZ2VzLCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNpdHkgPSBjKHNzLnR0LjJwcC5scyRzeXN0ZW1BZ2VEZW5zaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgei5TQSRzeXN0ZW1BZ2VEZW5zaXR5KSkKCiMgcGxvdCBhZ2UgZGlzdHJpYnV0aW9ucywgdGhlbiBwb29sIGFnZSBkaXN0cmlidXRpb25zCmdncGxvdChzYS5kaXN0LmRmLCBhZXMoQWdlLCBEZW5zaXR5KSkgKwogIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBNb2RlbCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBzLlNBJG1lYW5TeXN0ZW1BZ2UpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB6LlNBJG1lYW5TeXN0ZW1BZ2UsIGxpbmV0eXBlID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDMxMCkpICsKICBnZ3RpdGxlKCJNZWFuIHN5c3RlbSBhZ2UgZGlzdHJpYnV0aW9ucyAoMy1wb29sIG1vZGVscykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBCR1AtcGxvdHN9CiMgc2V0IHBsb3Qgb3V0cHV0IG9wdGlvbnMKb3B0aW9ucyhiaXRtYXBUeXBlID0gImNhaXJvIikKCiMgd2FybSBzaXRlCnBwXzEwLjJwcy5sYWcubHMgPC0gbW9kLmZpdHRlZC4ycHMubGFnW2dyZXAoInBwXzAtMTAiLCBuYW1lcyhtb2QuZml0dGVkLjJwcy5sYWcpKV0KcHBfMTAuMnBzLmxhZy5kZiA8LSBiaW5kX3Jvd3MocHBfMTAuMnBzLmxhZy5scywgLmlkID0gIlBNZWNvX2RlcHRoIikgJT4lCiAgbXV0YXRlKHBtID0gaWZlbHNlKGdyZXBsKCJBTiIsIFBNZWNvX2RlcHRoKSwgImFuZGVzaXRlIiwgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvX2RlcHRoKSwgImJhc2FsdCIsICJncmFuaXRlIikpKQpwcF8xMC4ycHMubGFnLmNvbi5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHNlcV9hbG9uZyhuYW1lcyhwcF8xMC4ycHMubGFnLmxzKSksIGZ1bmN0aW9uKGkpIHsKICBjb24uZGYuZngobmFtZXMocHBfMTAuMnBzLmxhZy5sc1tpXSkpCn0pLCAuaWQgPSAiUE1lY29fZGVwdGgiKSAlPiUKICBtdXRhdGUocG0gPSBpZmVsc2UoUE1lY29fZGVwdGggPT0gMSwgImFuZGVzaXRlIiwgaWZlbHNlKFBNZWNvX2RlcHRoID09IDIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCiMgYXRtCmF0bSA8LSBwcF8xMC4ycHMubGFnLmRmICU+JSBmaWx0ZXIocG9vbCA9PSAiYXRtIiAmIHBtID09ICJhbmRlc2l0ZSIpCgpwcC5wIDwtIHBwXzEwLjJwcy5sYWcuZGYgJT4lCiAgZmlsdGVyKHBvb2wgPT0gImJ1bGtDIiB8IHBvb2wgPT0gInJlc3BpcmF0aW9uIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh5ZWFycywgZDE0QykpICsKICBnZW9tX3BhdGgoZGF0YSA9IGF0bSwgYWVzKHllYXJzLCBkMTRDKSwgc2l6ZSA9IC4xKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBtLCBsaW5ldHlwZSA9IHBvb2wpLCBzaXplID0gLjgpICsKICBnZW9tX3BvaW50KGRhdGEgPSBwcF8xMC4ycHMubGFnLmNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG0pLCBzaXplID0gMiwgYWxwaGEgPSAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLCAiYmFzYWx0IiA9IGJhc2FsdCwgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICIiLCB2YWx1ZXMgPSBjKCJidWxrQyIgPSAxLCAicmVzcGlyYXRpb24iID0gMikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxOTUwLCAyMDIyKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC02MCwgODE1KSkgKwogICMgZ2d0aXRsZSgiV2FybSBzaXRlIDJwcyBtb2RlbCBmaXRzIikgKwogIHhsYWIoIlllYXIiKSArCiAgeWxhYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICAjIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KC45LCAiY20iKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKZ2dzYXZlKCIvVXNlcnMvamVmZi9EZXNrdG9wL3dhcm1fMnBzX2xhZ18xMF9tb2RGaXQucG5nIiwgcGxvdCA9IHBwLnAsCiAgICAgICB3aWR0aCA9IDMuMTYzLCBoZWlnaHQgPSAyLjUsIHVuaXRzID0gYygiaW4iKSkKZ2dzYXZlKCIvVXNlcnMvamVmZi9EZXNrdG9wL3dhcm1fMnBzX2xhZ18xMF9tb2RGaXRCSUcucG5nIiwgcGxvdCA9IHBwLnAsCiAgICAgICB3aWR0aCA9IDguNDksIGhlaWdodCA9IDQuMTcsIHVuaXRzID0gYygiaW4iKSkKCiMgY29vbCBzaXRlCndmXzEwLjJwcy5sYWcubHMgPC0gbW9kLmZpdHRlZC4ycHMubGFnW2dyZXAoIndmXzAtMTAiLCBuYW1lcyhtb2QuZml0dGVkLjJwcy5sYWcpKV0Kd2ZfMTAuMnBzLmxhZy5kZiA8LSBiaW5kX3Jvd3Mod2ZfMTAuMnBzLmxhZy5scywgLmlkID0gIlBNZWNvX2RlcHRoIikgJT4lCiAgbXV0YXRlKHBtID0gaWZlbHNlKGdyZXBsKCJBTiIsIFBNZWNvX2RlcHRoKSwgImFuZGVzaXRlIiwgaWZlbHNlKGdyZXBsKCJCUyIsIFBNZWNvX2RlcHRoKSwgImJhc2FsdCIsICJncmFuaXRlIikpKQp3Zl8xMC4ycHMubGFnLmNvbi5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHNlcV9hbG9uZyhuYW1lcyh3Zl8xMC4ycHMubGFnLmxzKSksIGZ1bmN0aW9uKGkpIHsKICBjb24uZGYuZngobmFtZXMod2ZfMTAuMnBzLmxhZy5sc1tpXSkpCn0pLCAuaWQgPSAiUE1lY29fZGVwdGgiKSAlPiUKICBtdXRhdGUocG0gPSBpZmVsc2UoUE1lY29fZGVwdGggPT0gMSwgImFuZGVzaXRlIiwgaWZlbHNlKFBNZWNvX2RlcHRoID09IDIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCndmLnAgPC0gd2ZfMTAuMnBzLmxhZy5kZiAlPiUKICBmaWx0ZXIocG9vbCA9PSAiYnVsa0MiIHwgcG9vbCA9PSAicmVzcGlyYXRpb24iKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDKSkgKwogIGdlb21fcGF0aChkYXRhID0gYXRtLCBhZXMoeWVhcnMsIGQxNEMpLCBzaXplID0gLjEpICsKICBnZW9tX3BhdGgoYWVzKGNvbG9yID0gcG0sIGxpbmV0eXBlID0gcG9vbCksIHNpemUgPSAuOCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IHdmXzEwLjJwcy5sYWcuY29uLmRmLCBhZXMoWWVhciwgZDE0YywgY29sb3IgPSBwbSksIHNpemUgPSAyLCBhbHBoYSA9IC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsICJiYXNhbHQiID0gYmFzYWx0LCAiZ3Jhbml0ZSIgPSBncmFuaXRlKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IGMoImJ1bGtDIiA9IDEsICJyZXNwaXJhdGlvbiIgPSAyKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCA4MTUpKSArCiAgIyBnZ3RpdGxlKCJDb29sIHNpdGUgMnBzIG1vZGVsIGZpdHMiKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogICMgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoLjksICJjbSIpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQpnZ3NhdmUoIi9Vc2Vycy9qZWZmL0Rlc2t0b3AvY29vbF8ycHNfbGFnXzEwX21vZEZpdC5wbmciLCBwbG90ID0gd2YucCwKICAgICAgIHdpZHRoID0gMy4xNjMsIGhlaWdodCA9IDIuNSwgdW5pdHMgPSBjKCJpbiIpKQpnZ3NhdmUoIi9Vc2Vycy9qZWZmL0Rlc2t0b3AvY29vbF8ycHNfbGFnXzEwX21vZEZpdEJJRy5wbmciLCBwbG90ID0gd2YucCwKICAgICAgIHdpZHRoID0gOC40OSwgaGVpZ2h0ID0gNC4xNywgdW5pdHMgPSBjKCJpbiIpKQoKIyBjb2xkIHNpdGUKcmZfMTAuMnBzLmxhZy5scyA8LSBtb2QuZml0dGVkLjJwcy5sYWdbZ3JlcCgicmZfMC0xMCIsIG5hbWVzKG1vZC5maXR0ZWQuMnBzLmxhZykpXQpyZl8xMC4ycHMubGFnLmRmIDwtIGJpbmRfcm93cyhyZl8xMC4ycHMubGFnLmxzLCAuaWQgPSAiUE1lY29fZGVwdGgiKSAlPiUKICBtdXRhdGUocG0gPSBpZmVsc2UoZ3JlcGwoIkFOIiwgUE1lY29fZGVwdGgpLCAiYW5kZXNpdGUiLCBpZmVsc2UoZ3JlcGwoIkJTIiwgUE1lY29fZGVwdGgpLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpCnJmXzEwLjJwcy5sYWcuY29uLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoc2VxX2Fsb25nKG5hbWVzKHJmXzEwLjJwcy5sYWcubHMpKSwgZnVuY3Rpb24oaSkgewogIGNvbi5kZi5meChuYW1lcyhyZl8xMC4ycHMubGFnLmxzW2ldKSkKfSksIC5pZCA9ICJQTWVjb19kZXB0aCIpICU+JQogIG11dGF0ZShwbSA9IGlmZWxzZShQTWVjb19kZXB0aCA9PSAxLCAiYW5kZXNpdGUiLCBpZmVsc2UoUE1lY29fZGVwdGggPT0gMiwgImJhc2FsdCIsICJncmFuaXRlIikpKQoKcmYucCA8LSByZl8xMC4ycHMubGFnLmRmICU+JQogIGZpbHRlcihwb29sID09ICJidWxrQyIgfCBwb29sID09ICJyZXNwaXJhdGlvbiIpICU+JQogIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMpKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBhdG0sIGFlcyh5ZWFycywgZDE0QyksIHNpemUgPSAuMSkgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBwbSwgbGluZXR5cGUgPSBwb29sKSwgc2l6ZSA9IC44KSArCiAgZ2VvbV9wb2ludChkYXRhID0gcmZfMTAuMnBzLmxhZy5jb24uZGYsIGFlcyhZZWFyLCBkMTRjLCBjb2xvciA9IHBtKSwgc2l6ZSA9IDIsIGFscGhhID0gLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICIiLCB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwgImJhc2FsdCIgPSBiYXNhbHQsICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiYnVsa0MiID0gMSwgInJlc3BpcmF0aW9uIiA9IDIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNjAsIDgxNSkpICsKICAjIGdndGl0bGUoIkNvbGQgc2l0ZSAycHMgbW9kZWwgZml0cyIpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgIyB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCguOSwgImNtIiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCmdnc2F2ZSgiL1VzZXJzL2plZmYvRGVza3RvcC9jb2xkXzJwc19sYWdfMTBfbW9kRml0LnBuZyIsIHBsb3QgPSByZi5wLAogICAgICAgd2lkdGggPSAzLjE2MywgaGVpZ2h0ID0gMi41LCB1bml0cyA9IGMoImluIikpCmdnc2F2ZSgiL1VzZXJzL2plZmYvRGVza3RvcC9jb2xkXzJwc19sYWdfMTBfbW9kRml0QklHLnBuZyIsIHBsb3QgPSByZi5wLAogICAgICAgd2lkdGggPSA4LjQ5LCBoZWlnaHQgPSA0LjE3LCB1bml0cyA9IGMoImluIikpCmBgYA==